آموزش پایتون

به روز ترین مطالب آموزشی و متدلوژی های برنامه نویسی

آموزش افزونه نویسی برای پایتون با زبان C

۳۳ بازديد
امروز با مقاله دیگری از سری مقاله های آموزش پایتون همراه شما هستیم، در این مقاله میخواهیم چگونگی افزونه نویسی در پایتون به کمک کدهای زبان C را مورد بررسی قرار دهیم..
به منظور نوشتن افزونه های اختصاصی جهت استفاده در اسکریپت های پایتون و اپلیکیشن های خود، لازم است به فایل های header پایتون دسترسی داشته باشید.در دستگاه هایی که سیستم عامل Unix بر روی آن نصب است، می بایست یک پکیج مختص توسعه دهنده (developer-specific) نظیر python2.5-dev را نصب نمایید.
کاربران ویندوز این فایل های header را به هنگام استفاده از binary Python installer به صورت یک پکیج دریافت می کنند. علاوه بر آن، برای درک مفاهیم این مبحث و نوشتن افزونه های اختصاصی خود جهت استفاده در اسکریپت های پایتون، لازم است آشنایی در سطح پیشرفته با زبان های C یا ++C داشته باشید.
 
آموزش Python : اولین نمونه از افزونه اختصاصی Python
کد ماژول و افزونه های پایتون، بایستی مانند زیر در چهار بخش سازمان دهی شود:
  • فایل header با اسم و پسوند Python.h.
  • توابع C که می خواهید به عنوان interface و الگوی پیاده سازی ماژول اختصاصی خود در اختیار توسعه دهنده قرار دهید.
  • یک جدول که اسم توابع اختصاصی شما را به توابع C داخل افزونه (کتابخانه یا ماژول) نگاشت می کند (method mapping table).
  • یک تابع سازنده جهت مقداردهی اولیه و نمونه سازی از کلاس (initialization function).
 
فایل Python.h
لازم است فایل Python.h را داخل فایلی که کدهای C شما را دربرمی گیرد (source file) قید نمایید. بدین وسیله شما به توابع کتابخانه ای درون ساخته ی پایتون (internal Python API) که برای ادغام و معرفی ماژول مورد نظر در interpreter (hook کردن کد ماژول شما در مفسر) بکار می رود، دسترسی خواهید داشت. لازم است Python.h را قبل از هر فایل header مورد نیاز دیگری لحاظ نمایید.
 
توابع C
اسم متد، نوع و تعداد پارامترهای ورودی (Signature) توابع اختصاصی شما و پیاده سازی آن، بایستی بر اساس یکی از الگوهای زیر انجام شود:
static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
                                 PyObject *args,
                                 PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );

هر یک از متدهای اعلان شده ی فوق، در خروجی خود یک آبجکت Python برمی گرداند. در پایتون مفهومی به نام تابع void (تابعی که خروجی ندارد یا مقداری را برنمی گرداند) وجود ندارد. اگر شما نمی خواهید که توابع مقدار خروجی داشته باشند، لازم است مقدار None را بازگردانی نمایید. header های پایتون یک macro (خط دستور) به نام Py_RETURN_NONE در خود به صورت از پیش تعریف شده دارند که این کار را انجام می دهند.
از آنجایی که اسم توابع C هیچگاه خارج از ماژول/افزونه قابل مشاهده و دسترسی نیستند، شما می توانید هر اسمی برای متدهای اختصاصی خود انتخاب کنید. لازم به ذکر است که این توابع با کلیدواژه ی static تعریف می شوند. اسم توابع C معمولا از ترکیبی از اسم ماژول و متد مورد نظر تشکیل می شود. در زیر نمونه ای را مشاهده می کنید:
static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

کد حاضر یک تابع Python به نام func را تعریف می کند که داخل افزونه ی module کپسوله سازی شده است. حال شما به این توابع C داخل جدول نگاشت متد (method table) Pointer و اشاره گر تعریف می کنید که در بخش بعدی کد برنامه ی شما انجام می شود.
 
آموزش برنامه نویسی پایتون : جدول نگاشت توابع
این جدول نگاشت متد (method table) یک آرایه ی ساده از structure های PyMethodDef است (PyMethodDef یک مدل برای تعریف متد است). این structure ساختاری مشابه زیر دارد:
struct PyMethodDef {
   char *ml_name;
   PyCFunction ml_meth;
   int ml_flags;
   char *ml_doc;
};

در زیر هر یک از اعضای این ساختار شرح داده اند:
  • فیلد ml_name : اسم تابع پایتون.
  • فیلد ml_meth : آدرس تابعی که هر یک از signature های نام برده در بخش قبلی را دارا می باشد.
  • فیلد ml_flags : این فیلد به مفسر پایتون اعلان می کند که فیلد دوم (ml_meth) کدام یک از signature های نام برده را اتخاذ می کند :
  1. این flag معمولا مقداری از METH_VARARGS دارد.
  2. اگر می خواهید آرگومان های کلیدواژه ای را در تابع تزریق نمایید، این flag می تواند OR بیتی با METH_KEYWORDS را شامل شود.
  3. این flag همچنین می تواند مقدار METH_NOARGS را داشته باشد، بدین معنی که هیچ پارامتری به تابع فرستاده نمی شود.
  • فیلد ml_doc : این docstring (رشته یا comment ای که توضیحی درباره ی کارایی تابع می دهد) تابع است. اگر برنامه نویس comment ای برای تابع تنظیم نکند، در آن صورت مقدار آن NULL خواهد بود.
این جدول بایستی با یک sentinel که از NULL و 0 برای اعضای مرتبط تشکیل شده، خاتمه یابد.
 
مثال :
برای متد اعلان شده در بالا، از جدول نگاشت تابع (method mapping table) زیر استفاده می کنیم:
static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};
 
آموزش زبان پایتون : تابع مقداردهی اولیه (initModule)
آخرین بخش ماژول یا افزونه ی اختصاصی شما بایستی تابع مقداردهنده ی اولیه (initialization function) را شامل شود. این تابع را مفسر پایتون زمانی که ماژول در حافظه بارگذاری می شود، فرامی خواند. لازم است اسم این تابع initModule انتخاب شود (Module اسم ماژول و init اسم خود تابع می باشد).
تابع مقداردهنده ی اولیه بایستی از کتابخانه که می نویسید export و خروجی گرفته شده باشد. header های Python با اعلان دستور PyMODINIT_FUNC امکان انجام این کار را در محیطی که اسکریپت ها در آن کامپایل می شوند را فراهم می آورد. کافی است به هنگام تعریف تابع مورد نظر از آن استفاده نمایید.
تابع مقداردهنده ی اولیه ی زبان C شما دارای ساختار کلی زیر می باشد:
PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}
در زیر شرح هر یک از پارامترهای تابع Py_InitModule3 را به تفصیل مشاهده می کنید:
  • پارامتر func : تابعی است که قرار است export و به اصطلاح خروجی گرفته شود.
  • پارامتر module_methods : اسم جدول نگاشت تابع (mapping table) که در بالا به آن اشاره شد.
  • پارامتر docstring : این پارامتر همان رشته ی متنی و comment ای است که جهت ارائه ی توضیح درباره ی قابلیت تابع در افزونه ی اختصاصی درج می شود.
در زیر تمامی بخش های تشکیل دهنده یک افزونه استاندارد را یکجا مشاهده می کنید:
#include < python.h>
static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}
static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}
< /python.h>
 
مثال :
نمونه کاربردی که کلیه مفاهیم فوق را به صورت عملی بکار می برد را در زیر مشاهده می کنید:
#include < python.h>
static PyObject* helloworld(PyObject* self)
{
    return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[ ] =
    "helloworld( ): Any message you want to put here!!n"
static PyMethodDef helloworld_funcs[ ] = {
    {"helloworld", (PyCFunction)helloworld, 
     METH_NOARGS, helloworld_docs},
    {NULL}
};
void inithelloworld(void)
{
    Py_InitModule3("helloworld", helloworld_funcs,
                   "Extension module example!");
}
< /python.h>

دستور Py_BuildValue در مثال بالا، یک مقدار Python را build یا کامپایل می کند. کد مورد نظر را داخل فایل hello.c ذخیره نمایید. در زیر با نحوه ی کامپایل و نصب ماژول که از اسکریپت پایتون فراخوانی می شود، را خواهید آموخت.
 
کامپایل و نصب افزونه ها (build)
پکیج distutils توزیع و نصب ماژول های پایتون، خواه ماژول های اصلی و خالص خود پایوتن باشد خواه ماژول های اختصاصی و تنظیم شده توسط توسعه دهنده، را با روشی استاندارد بسیار آسان می سازد. ماژول ها در همان قالب اولیه (source form) توزیع شده و در اختیار برنامه نویس قرار می گیرد. برنامه نویس سپس ماژول مورد نظر را با فراخوانی اسکریپت نصب (setup script) به نام setup.py ، نصب می نماید.
جهت نصب ماژول ذکر شده در بالا، بایستی اسکریپت setup.py را آماده نموده و به روش زیر اجرا نمایید:
from distutils.core import setup, Extension
setup(name='helloworld', version='1.0',  
      ext_modules=[Extension('helloworld', ['hello.c'])])

اکنون با فراخوانی دستور زیر، تمامی مراحل لازم نظیر کامپایل و آماده سازی (linking & compilation) کد را انجام دهید. کد زیر کلیه ی مراحل مورد نیاز کامپایل و لینک ماژول با کامپایلر، دستورات linker و flag های مناسب را انجام داده، متعاقبا خروجی (.dll) را در پوشه ی مربوطه جایگذاری (کپی) می کند.
$ python setup.py install

در سیستم های مبتنی بر Unix، لازم است این دستور را با حساب کاربری root اجرا نمایید تا امکان یا مجوز درج داده در پوشه ی site-packages را داشته باشید. در سیستم عامل ویندوز لازم به انجام این کار نیست.
 
آموزش Python : وارد کردن و استفاده از افزونه ها در پروژه
پس از نصب افزونه ی دلخواه خود، می توانید آن را در اسکرپیت پایتون خود با دستور import وارد کرده و فراخوانی نمایید:
#!/usr/bin/python
import helloworld
print helloworld.helloworld()
خروجی زیر را تولید می کند:
Hello, Python extensions!!
 
ارسال پارامتر به تابع
در طول توسعه پروژه، گاه می بایست توابعی را اعلان و فراخوانی نمایید که پارامترهایی را به عنوان ورودی می پذیرد. از اینرو بایستی signature (اسم تابع + نوع، تعداد پارامتر ورودی) مربوطه را برای توابع C ماژول اختصاصی خود انتخاب نمایید. به طور مثال، تابع ذیل را در نظر بگیرید که تعدادی پارامتر به عنوان ورودی پذیرفته و بدین صورت اعلان می شود:
static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Parse args and do something interesting here. */
   Py_RETURN_NONE;
}

متد table که تابع جدید را در خود کپسوله می کند، به صورت زیر خواهد بود:
static PyMethodDef module_methods[ ] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { "func", module_func, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
};

می توانید با استفاده از تابع کتابخانه ای PyArg_ParseTuple آرگومان های مورد نیاز را از متغیر اشاره گر (pointer) به PyObject که به عنوان آرگومان به تابع C ارسال شده، استخراج نمایید.
اولین آرگومان ارسالی به PyArg_ParseTuple، آرگومان args می باشد. این آرگومان همان آبجکتی است که باید parse یا تحلیل نحوی شود. پارامتر دوم یک رشته ی فرمت دهی (format string) است که آرگومان ها را به آن شکلی که مورد انتظار شما است، به نمایش می گذارد. به تعداد آرگومان ها، یک یا چند کاراکتر در رشته ی فرمت دهی وجود دارد که نشانگر آرگومان های مزبور می باشند.
static PyObject *module_func(PyObject *self, PyObject *args) {
   int i;
   double d;
   char *s;
   if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
      return NULL;
   }
   /* Do something interesting here. */
   Py_RETURN_NONE;
}

با کامپایل نمودن ورژن جدید از ماژول خود و وارد کردن آن در متن پروژه، قادر خواهید بود تابع مورد نظر را با تعداد دلخواه و نوع مختلف از آرگومان ها فراخوانی نمایید:
module.func(1, s="three", d=2.0)
module.func(i=1, d=2.0, s="three")
module.func(s="three", d=2.0, i=1)
 
تابع PyArg_ParseTuple
در زیر تعداد و نوع ورودی های تابع را به شکل استاندارد (signature) PyArg_ParseTuple مشاهده می کنید:
int PyArg_ParseTuple(PyObject* tuple,char* format,...)

در صورتی که عملیات با موفقیت انجام شود، مقداری غیر صفر و چنانچه عملیات ناموفق بوده و خطا رخ داد، مقدار 0 در خروجی بازگردانی می شود. tuple، آبجکت PyObject* بوده که همان آرگومان دوم ارسال شده به تابع C می باشد. آرگومان سوم، format، یک رشته ی C می باشد که نشانگر آرگومان های الزامی و اختیاری می باشد.
در زیر لیستی از کدهای فرمت دهی که به تابع PyArg_ParseTuple ارسال می شود همراه با شرح هر یک مشاهده می کنید:
  • کد c در پایتون معادل char در زبان C : یک رشته پایتون با طول 1 (رشته ی حاوی یک کاراکتر) معادل char در C می شود.
  • کد d در پایتون معادل double در زبان C : یک مقدار عددی float (ممیز و اعشاری) که معادل double (اعشاری با دقت بیشتر) در C محسوب می شود.
  • کد f در پایتون معادل float در زبان C : یک float (مقدار عددی اعشاری از نوع float) در پایتون معادل float در C محسوب می شود.
  • کد i در پایتون معادل int در زبان C : یک int (نوع عدد صحیح) معادل long در زبان C درنظر گرفته می شود.
  • کد l در پایتون معادل long در زبان C : یک int در زبان پایتون معادل نوع داده ای long در زبان C در نظر گرفته می شود.
  • کد L در پایتون معادل long long در زبان C : یک int یا نوع داده ای عدد صحیح در زبان پایتون، معادل long long در زبان C محسوب می شود.
  • کد O در پایتون معادل PyObject* در زبان C : یک اشاره گر غیر NULL به آرگومان Python بازگردانی می کند.
  • کد s در پایتون معادل char* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
  • کد s# در پایتون معادل char*+int در زبان C : رشته Python را به آدرس و طول سازگار در C تبدیل می کند.
  • کد t# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد با این تفاوت که هر آبجکتی که اینترفیس read-only را پیاده سازی کند، می پذیرد.
  • کد u در پایتون معادل Py_UNICODE* در زبان C : کاراکترهای Unicode (null-terminated buffer) مستقر در بافر که انتهای آن به null ختم می شود را به آبجکت Unicode پایتون تبدیل می کند.
  • کد u# در پایتون معادل Py_UNICODE*+int در زبان C : نوع دیگر از u که در دو متغیر C ذخیره می شود، اولی یک اشاره گر به آدرس Unicode مستقر در بافر و دومی طول آن.
  • کد w# در پایتون معادل char*+int در زبان C : مشابه s#، اما هر آّبجکتی که اینترفیس read/write بافر را پیاده سازی می کند، پذیرفته و با آن سازگاری دارد.
  • کد z در پایتون معادل char* در زبان C : کاربری مشابه s دارد با این تفاوت که None نیز می پذیرد (char* زبان C را بر روی NULL تنظیم می کند).
  • کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد اما None نیز می پذیرد (char* زبان C را روی NULL تنظیم می نماید).
  • کد (...) در پایتون معادل as per ... در زبان C : یک دنباله (sequence) پایتون که هر آیتم در آن یک آرگومان در نظر گرفته می شود.
  • کد | در پایتون معادل double در زبان C : آرگومان های زیر اختیاری می باشد.
  • کد : در پایتون معادل double در زبان C : قبل از اسم تابع در پیغام های خطا قرار می گیرد.
  • کد ; در پایتون معادل double در زبان C : قبل از درج کل متن پیغام خطا قرار می گیرد.
 
بازگردانی مقادیر در خروجی
تابع Py_BuildValue، درست مانند PyArg_ParseTuple ، یک رشته ی فرمت دهی (string format) به عنوان ورودی دریافت می کند. بجای ارسال آدرس مقادیری که کامپایل می کنید، بایستی خود مقادیر را به عنوان آرگومان به تابع مورد نظر بفرستید. در زیر مثالی از نحوه ی پیاده سازی یک تابع که عملیات جمع را انجام می دهد، تابع add، مشاهده می کنید:
static PyObject *foo_add(PyObject *self, PyObject *args) {
   int a;
   int b;
   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("i", a + b);
}

معادل پیاده سازی آن در زبان پایتون به صورت زیر می باشد:
def add(a, b):
   return (a + b)
می توانید دو خروجی از این تابع بازگردانی نمایید. این عملیات در پایتون با یک لیست قابل پیاده سازی خواهد بود:
static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
   int a;
   int b;
   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("ii", a + b, a - b);
}

معادل پیاده سازی آن در زبان پایتون به صورت خواهد بود:
def add_subtract(a, b):
   return (a + b, a - b)

 
تابع Py_BuildValue
در زیر روش استاندارد تنظیم اسم تابع، نوع و تعداد پارامترهای ورودی آن که signature خوانده می شود را ویژه ی تابع Py_BuildValue مشاهده می کنید:
PyObject* Py_BuildValue(char* format,...)
پارامتر format، یک رشته ی C بوده و نشانگر آبجکت Python است که پارامتر حاضر باید نهایتا به آن کامپایل شود. آرگومان های زیر مقادیر C هستند که خروجی از آن ها ساخته و کامپایل می شود. نتیجه ی PyObject* یک اشاره گر (reference) جدید می باشد.
جدول زیر code string های پرکاربرد را با ذکر کارایی هر یک در اختیار شما قرار می دهد:
  • کد c در پایتون معادل char در زبان C : یک char زبان C، به رشته ای با طول یک کاراکتر تبدیل می شود.
  • کد d در پایتون معادل double در زبان C : یک نوع عددی double زبان C، به float در پایتون تبدیل می شود.
  • کد f در پایتون معادل float در زبان C : یک float یا نوع عددی اعشاری زبان C، به همان float در پایتون تبدیل می شود.
  • کد i در پایتون معادل int در زبان C : یک Int زبان C به همان int (نوع عددی صحیح) در پایتون تبدیل می شود.
  • کد l در پایتون معادل long در زبان C : یک long در زبان C به int در پایتون تبدیل می شود.
  • کد N در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده ولی reference count (تعداد دفعاتی که آبجکت مورد نظر به آن دسترسی صورت می گیرد) آن را افزایش نمی دهد.
  • کد O در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده و reference count آن را طبق انتظار یک واحد افزایش می دهد.
  • کد O& در پایتون معادل convert+void* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
  • کد s در پایتون معادل char* در زبان C : یک char* که در انتهای خود 0 داشته را به رشته ی Python تبدیل می نماید یا NULL را به None.
  • کد s# در پایتون معادل char*+int در زبان C : یک رشته ی C و طول (length) آن را به یک آبجکت Python تبدیل می کند. اگر اشاره گر از نوع string (string pointer) برابر NULL باشد، طول یا length نادیده گرفته شده و None در خروجی بازگردانی می کند.
  • کد u در پایتون معادل Py_UNICODE* در زبان C : یک رشته که در سطح زبان C تعریف شده و انتهای آن مقدار NULL وجود دارد را به یونیکد پایتون تبدیل کرده و اگر NULL بود آن را به None تبدیل می کند. Buffer ای از داده های Unicode که انتهای آن null وجود دارد را به آبجکت پایتون تبدیل می کند. اگر Unicode buffer برابر NULL بود، در خروجی None بازیابی می شود.
  • کد u# در پایتون معادل Py_UNICODE*+int در زبان C : یک رشته ی تعریف شده در سطح C و طول آن را به آبجکت Unicode پایتون تبدیل می کند یا NULL را به None تبدیل می کند. به عبارت دیگر، یک Unicode (که استانداردهای USC-2 یا UCS-4) مستقر در buffer یا حافظه میانی و طول (length) آن را به آبجکت Unicode پایتون تبدیل می کند. اگر اشاره گر به Unicode موجود در buffer برابر NULL بود، طول آن نادیده گرفته شده و None را در خروجی برمی گرداند.
  • کد w# در پایتون معادل char*+int در زبان C : مشابه s#، با این تفاوت که هر آبجکتی که اینترفیس read-write را پیاده سازی می کند، می پذیرد. متغیر char * طوری تنظیم شده که به اولین بایت از buffer اشاره کند و Py_ssize_t را بر روی طول buffer تنظیم می کند.
  • کد z در پایتون معادل char* در زبان C : مشابه s، با این تفاوت که None نیز می پذیرد (char* در C را روی NULL تنظیم می کند).
  • کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد (char* در C را بر روی NULL تنظیم می کند).
  • کد (...) در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک متغیر tuple در پایتون می سازد.
  • کد [...] در پایتون معادل as per ... در زبان C : از مقادیر C، یک لیست (list) در پایتون تولید می کند.
  • کد {...} در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک dictionary که المان های آن به صورت متناوب، کلید و مقدار، سازمان دهی شده، ایجاد می کند.
به طور مثال تابع Py_BuildValue("{issi}",23,"zig","zag",42) یک dictionary پایتون به صورت {23:'zig','zag':42} در خروجی تولید می کند.

با دیگر آموزش های ما در زمینه آموزش پایتون و دیگر زبان های برنامه نویسی همراه ما باشید...

آموزش کار با XML در پایتون

۳۶ بازديد
در این مقاله از مجموعه مقاله های آموزش پایتون به بررسی کار با XML در پایتون می پردازیم..
عبارت Extensible Markup Language یا به اختصار XML به معنی زبان نشانه گذاری گسترش پذیر است که یک زبان نشانه گذاری مشابه HTML یا SGML است. کنسرسیوم وب جهان گستر این زبان را به عنوان یک استاندارد سراسری توصیه می کند. چنانچه اپلیکیشنی که قصد طراحی آن را دارید، داده های حجیم و سنگینی برای نگهداری ندارد، در آن صورت می توانید بدون زحمت طراحی دیتابیس و استفاده از پشتوانه ی SQL، اطلاعات برنامه ی خود را در قالب XMLذخیره نمایید.
 
آموزش زبان پایتون : معماری ها و توابع کتابخانه ای تحلیل گر XML Parser
کتابخانه ی استاندارد python تعدادی interface (الگوی پیاده سازی) معدود اما کارا جهت کار با XML در اختیار برنامه نویس قرار می دهد که در زیر به شرح آن ها می پردازیم. دو API و توابع کتابخانه ای پرکاربرد و ساده ای که توصیه می شود عبارتند از :
  • تابع (SAX (Simple API for XML : در این API، توابع Callback ای برای رخدادهای مورد نظر معرفی (register) می کنید و سپس به parser اجازه می دهید به تحلیل باقی فایل بپردازد. ابزار جاری برای شرایطی مفید می باشد که فایل های اپلیکیشن حجیم بوده و شما با محدودیت حافظه مواجه هستید. در واقع API حاضر فایل را از روی دیسک تحلیل و تفسیر می کند و به همین جهت هیچگاه کل فایل در حافظه بارگذاری نشده و آن را اشغال نمی کند.
  • تابع DOM (Document Object Model) : API جاری را کنسرسیوم وب جهان گستر توصیه می کند. در این API کل محتوای فایل داخل حافظه بارگذاری و به صورت درختی یا سلسله مراتبی سازماندهی می شود و کلیه ی ویژگی های یک فایل XML را به نمایش می گذارد.
تابع SAX قادر نیست هنگام کار با فایل های حجیم، اطلاعات را به سرعت DOM پردازش کند. از طرف دیگر، اگر منحصرا از DOM استفاده کنید، به ویژه برای پردازش فایل های کوچک و کم حجم، قطعا میزان قابل توجهی از منابع شما هدر می رود. SAX فایل ها را با مجوز در سطح فقط خواندن باز می کند، در حالی که DOM امکان اعمال تغییرات در فایل XML را فراهم می آورد. از آنجایی که دو API مزبور مکمل یکدیگر هستند، دلیلی وجود ندارد که از هر دو در پروژه های بزرگ استفاده نکنید. نمونه کدهای XML که در مثال های زیر استفاده کرده و به عنوان ورودی توابع پردازش و parse مورد استفاده قرار می دهیم، فایل movies.xml با محتوای زیر خواهد بود :

< collection shelf="New Arrivals">

< movie title="Enemy Behind">
< type>War, Thriller< /type>
< format>DVD< /format>
< year>2003< /year>
< rating>PG< /rating>
< stars>10< /stars>
< description>Talk about a US-Japan war< /description>
< /movie>
< movie title="Transformers">
< type>Anime, Science Fiction< /type>
< format>DVD< /format>
< year>1989< /year>
< rating>R< /rating>
< stars>8< /stars>
< description>A schientific fiction< /description>
< /movie>
< movie title="Trigun">
< type>Anime, Action< /type>
< format>DVD< /format>
< episodes>4< /episodes>
< rating>PG< /rating>
< stars>10< /stars>
< description>Vash the Stampede!< /description>
< /movie>
< type>Comedy< /type>
< format>VHS< /format>
< rating>PG< /rating>
< stars>2< /stars>
< description>Viewable boredom< /description>
< /movie>
< /collection>
 

آموزش Python
 : پردازش و تفسیر XML به وسیله ی توابع SAX
تابع SAX یک interface حاوی مجموعه توابع استاندارد برای تحلیل و پردازش XML به روش رخداد محور (Event-driven) است. جهت استفاده از interface یاد شده برای پردازش و فایل های XML، لازم است با ارث بری (تعریف کلاس مشتق) از xml.sax.ContentHandler، کلاس ContentHandler اختصاصی خود را ایجاد نمایید.
کلاس ContentHandler اختصاصی شما در واقع می تواند تگ ها و attribute های نسخه یا نسخه های مختلف XML را مدیریت نماید. آبجکت ContentHandler تعدادی متد برای مدیریت رخدادهای مختلف parse (پردازش و تحلیل) ارائه می دهد که parser این متدها را به هنگام بارگذاری محتوای فایل XML در حافظه و پردازش آن ها، از ContentHandler فراخوانی می کند.
متدهای startDocument و endDocument هریک به ترتیب در ابتدا و انتهای فایل XML فراخوانی می شوند. اطلاعات و داده های مربوط به کاراکترهای فایل XML از طریق پارامتر text در اختیار متد (character(text قرار می گیرد.
متد ContentHandler در ابتدا و انتهای هر المان فراخوانی می شود. اگر parser در وضعیت namespace mode قرار داشته باشد، در آن صورت متدهای (startElement(tag, attributes و (endElement(tag صدا زده می شوند و در غیر این صورت متدهای مربوطه یعنی startElementNS و endElementNS فراخوانده می شوند. در اینجا منظور از tag در واقع المان tag و attributes، آبجکت Attributes است.
در زیر سایر متدهای مهم که فهم آن ها برای کار با SAX مهم می باشد را مشاهده می کنید :
 
متد جاری یک آبجکت parser جدید ایجاد کرده و آن را در خروجی برمی گرداند. آبجکت parser که در خروجی بازگردانی می شود، اولین نوع parser است که سیستم پیدا می کند.
xml.sax.make_parser( [parser_list] )
در زیر جزئیات پارامترها به تفصیل شرح داده است :
  • پارامتر parser_list : آرگومان اختیاری متشکل از یک لیست از parser ها برای استفاده که تمامی آن ها بایستی متد make_parser را پیاده سازی می کند.

متد زیر یک مفسر و تحلیل گر نحوی SAX تعریف کرده و با استفاده از آن محتوای فایل مورد نظر را parse (تفسیر و تبدیل) می کند.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
در زیر اطلاعات پارامترهای متد فوق به تفصیل شرح داده شده است :
  • پارامتر xmlfile : این اسم فایل XML است که محتوای آن قرار است خوانده و تفسیر شود.
  • پارامتر contenthandler : آبجکت ساخته شده از کلاس ContentHandler.
  • این پارامتر اختیاری بوده و در صورت استفاده از آن بایستی یک آبجکت ErrorHandler از SAX باشد.
 
آموزش زبان پایتون : متد parseString
متد دیگری که یک تحلیل گر و مفسر SAX ایجاد کرده و رشته ی XML ارسالی را parse می کند، parseString می باشد :
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
در زیر هریک از پارامتر ها به تفصیل شرح داده شده است :
  • پارامتر xmlstring : اسم رشته ی XML که محتوا از آن خوانده می شود.
  • پارامتر contenthandler : بایستی یک آبجکت ContentHandler باشد.
  • پارامتر errorhandler : پارامتر اختیاری که یک آبجکت ErrorHandler از SAX می باشد.

مثال :
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""
   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title
   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
       print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""
   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
if ( __name__ == "__main__"):
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   parser.parse("movies.xml")

خروجی :
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
 

آموزش Python
 :
 پردازش و تفسیر فایل های XML با استفاده از توابع DOM
مدل شی گرای فایل (Document Object Model) یا به اختصار DOM یک API و مجموع توابع کتابخانه ای است که کنسرسیوم وب جهان گستر برای دسترسی و ویرایش محتوای فایل های XML، به توسعه دهندگان توصیه می کند. DOMبه ویژه برای اپلیکیشن هایی که لازم است به محتوای فایل XML آن به صورت رندوم دسترسی صورت گیرد، مفید می باشد. SAX به توسعه دهنده امکان دسترسی فقط به یک قسمت از فایل XML را در آن واحد می دهد. به طور مثال، هنگام دسترسی به یک المان از فایل XML، امکان دسترسی به سایر المان های فایل برای شما وجود ندارد.
ماژول xml.dom، به شما این امکان را می دهد تا یک آبجکت minidom ایجاد کرده و محتوای فایل XML را به سرعت در حافظه بارگذاری نمایید. آبجکت minidom متد کارا و ساده تری جهت ساخت درخت DOM از فایل XML در اختیار توسعه دهنده قرار می دهد.
نمونه کد زیر متد ([parse(file [,parser از آبجکت minidom را صدا زده و محتوای فایل XML را تجزیه و به آبجکت درخت DOM تبدیل می کند.

مثال :
#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")
   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data

خروجی :
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
 
با دیگر مقالات آموزش پایتون همراه ما باشید..

آموزش ارسال ایمیل با پایتون

۳۹ بازديد
در این مقاله به آموزش ارسال ایمیل با پایتون و چگونگی استفاده از SMTP در پایتون را با یکدیگر مورد بررسی قرار می دهیم..
 

آموزش پایتون
: فرستادن ایمیل با SMTP در پایتون
عبارت Simple Mail Transfer Protocol یا به اختصار SMPT (پروتکل ارسال و انتقال ایمیل) معرفی پروتکلی است که ارسال ایمیل و آدرس دهی (routing) آن بین سرویس دهنده های ایمیل را مدیریت می کند.
پایتون ماژولی به نام smtplib در اختیار توسعه دهنده قرار می دهد که یک آبجکت حاوی اطلاعات session ( اطلاعات جلسه ی کاری کاربر یا client session object) را در خود به صورت کپسوله داشته و می توان از آن برای ارسال ایمیل به هر دستگاه آنلاینی که listener daemon (برنامه ی ای که به رخدادها گوش داده و در پس زمینه فعالیت می کند) SMTP یا ESMTP بر روی آن فعال است، استفاده نمود. در زیر نحوه ی ساخت یک آبجکت SMTP ساده که بعده ها جهت ارسال ایمیل مورد استفاده قرار می گیرد، را مشاهده می کنید :
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
 

در زیر شرح کاربرد هر یک از پارامترهای عنوان شده در قطعه کد بالا را مشاهده می کنید :
  • پارامتر host : پارامتر جاری همان میزبان یا هاستی است که به عنوان سرویس دهنده ی SMTP شما ایفای نقش می کند (SMTP server شما بر روی آن اجرا می شود). شما می توانید مقدار این پارامتر را آدرس IP میزبان یا اسم دامنه همچون tahlildadeh.com تنظیم نمایید. استفاده از این آرگومان اختیاری است.
  • پارامتر port : در صورت مقداردهی آرگومان اول، لازم است یک پورت یا شماره ی درگاه نیز مشخص نمایید که SMPT Server به آن گوش می دهد. شماره ی این پورت معمولا 25 می باشد.
  • پارامتر local_hostname : چنانچه SMPT Server شما بر روی دستگاه محلی (کامپیوتر شخصی) مستقر و فعال باشد، در آن صورت کافی است مقدار این پارامتر را localhost قرار دهید.

در آبجکت SMPT متدی تعبیه شده به نام sendmail که اغلب، توسعه دهنده با استفاده از آن کار عملیات ارسال پیغام مورد نظر را به انجام می رساند. متد نام برده در کل سه پارامتر ورودی دریافت می کند که به شرح زیر می باشند :
  • پارامتر sender : یک مقدار رشته ای دربردارنده آدرس ارسال کننده پیغام.
  • پارامتر receivers : لیستی از رشته ها که هریک مختص به دریافت کننده ی مجزا می باشد.
  • پارامتر message : یک پیغام به صورت رشته و فرمت دهی شده بر اساس مشخصات و قواعد RFC ها.

مثال :
در زیر یک اسکریپت ساده پایتون را مشاهده می کنید که ایمیلی را ارسال می کند.
#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
   except SMTPException:
   print "Error: unable to send email"
 
در تمرین جاری، یک ایمیل ساده داخل متغیر message و کوتیشن سه تایی درج گردید و همان طور که می بینید، هدرها به روش صحیح فرمت دهی شده اند. هر ایمیل، سه هدر به ترتیب From ،To و Subject که به وسیله ویرگول از هم و به وسیله خط سفید از بدنه پیغام جدا شده اند را شامل می شود.
به منظور ارسال ایمیل، ابتدا با استفاده از smtpObj به SMPT Server (سرویس دهنده ی سرور) مستقر بر روی دستگاه محلی (local) وصل شوید، سپس متد sendmail را فراخوانی کرده و پیغام، آدرس فرم و آدرس مقصد را به عنوان پارامتر به این متد ارسال نمایید (اگرچه فرم و آدرس داخل خود ایمیل گنجانده شده، با این حال از این مقدارها همیشه برای آدرس دهی یا route ایمیل استفاده نمی شود).
چنانچه شما برای ارسال ایمیل از SMPT Server که بر روی دستگاه شما (local) شما نصب و اجرا شده، استفاده نمی کنید، در آن صورت می توانید با استفاده از smtplib client به یک سرور SMPT راه دور متصل شوید. برای این منظور لازم است ارائه دهنده ی ایمیل جزئیات و اطلاعات mail server خروجی دهنده را در اختیار شما قرار داده باشد و شما نیز آن ها را به صورت زیر بکار ببرید، مگر اینکه برای ارسال ایمیل از یک سرویس آماده همچون Hotmail و Yahoo استفاده نمایید که در آن صورت نیازی به این اطلاعات نیست.
smtplib.SMTP('mail.your-domain.com', 25)
 

آموزش Python : ارسال فایل ایمیل به صورت HTML با استفاده از Python
زمانی که توسعه دهنده یک پیغام متنی را با استفاده از Python ارسال می کند، تمامی محتوای فایل به عنوان متن ساده در نظر گرفته می شود. به عبارت دیگر حتی اگر تگ های HTML را در پیغام متنی بگنجانید، باز هم محتوای فایل به صورت متن ساده نمایش داده شده و تگ های HTML بر اساس گرامر زبان نشانه گذاری HTML فرمت دهی نمی شوند. پایتون امکانی را در اختیار توسعه دهنده قرار می دهد که به واسطه ی آن می توان یک پیغام HTML را به صورت یک فایل واقعی HTML ارسال کرد.
به هنگام ارسال یک ایمیل، می توان نوع فایل (Mime version)، نوع محتوا و مجموعه کاراکتری که باید به صورت یک ایمیل HTML ارسال شود را مشخص نمایید.

مثال :
در زیر کدی را مشاهده می کنید که محتوایی با فرمت HTML را به صورت ایمیل ارسال می کند :
#!/usr/bin/python
import smtplib
message = """From: From Person
To: To Person
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
< b>This is HTML message.< /b>
< h1>This is headline.< /h1>
"""
try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)   
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"
 
 
آموزش برنامه نویسی پایتون : ارسال محتوا همراه با ایمیل در پایتون
جهت ارسال ایمیل با محتوای مختلط، لازم است مقدار هدر Content-type را برابر multipart/mixed قرار دهید. پس از آن، متن و محتوای الصاقی (attachment) را در boundaries دقیقا اعلان کنید. برای تعریف boundary، دو خط تیره (هایفن) و یک عدد منحصربفرد درج کنید که این بخش نباید در بدنه ی ایمیل یا بخش پیغام ظاهر شود. سپس یک boundary نهایی درج می کنید که نشانگر بخش پایانی ایمیل بوده و باید به دو خط تیره ختم شود. فایل های الصاق شده باید قبل از ارسال، به وسیله ی تابع pack("m") بر مبنای الگوریتم و روش کدگذاری base64 رمزنگاری شوند.

مثال :
در مثال زیر، فایل /tmp/test.txt به عنوان محتوای الصاقی همراه با ایمیل ارسال می شود :
#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person
To: To Person
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name="%s"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"
 
با دیگر مقاله های ما در زمینه آموزش پایتون همراه ما باشید...

آموزش پایتون-خواندن,نوشتن فایل,خطاها و استثناها

۱۲۱ بازديد
سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم
  • مقایسه دنباله ها و سایر انواع در برنامه نویسی Python
  • آموزش ماژول ها در برنامه نویسی پایتون
  • آموزش ماژول های استاندارد در برنامه نویسی پایتون
  • آموزش تابع dir() در برنامه نویسی پایتون
با ادامه آموزش پایتون همراه ما باشید.
 
آموزش خواندن و نوشتن فایل در زبان برنامه نویسی پایتون
دستور open() یک شی فایل (file object) را باز می گرداند، و در اکثر مواقع با دو آرگومان استفاده می شود:
open(filename, mode)
>>> f = open('workfile', 'w')
آرگومان اول یک رشته شامل نام فایل است. آرگومان دوم یک رشته دیگر شامل تعداد کمی کاراکتر است که روش استفاده از فایل را توصیف می کند. حالت (mode) می تواند r باشد برای زمانی که فایل فقط خوانده می شود، w برای فقط نوشتن (فایل موجود با نام مشابه پاک خواهد شد)، و a فایل را برای افزودن(append) باز می کند؛
هر داده ای که در فایل نوشته شود به صورت خودکار به انتهای فایل اضافه می شود. r+ فایل را برای خواندن و نوشتن باز می کند. آرگومان حالت اختیاری است.
در صوت حذف، r در نظر گرفته می شود. به طور معمول فایل ها در حالت متن(text) باز می شوند، این به این معنی است که شما رشته ها را از فایل می خوانید و درون فایل می نویسید، که این فایل به یک روش رمزنگاری خاص کدگذاری شده است.
اگر روش رمزنگاری مشخص نشده باشد، پیش فرض وابسته به پلتفرم(platform) است
اگر b به حالت اضافه شود، فایل در حالت باینری (binary) باز می شود.، حال، داده در قالب اشیای بایت خوانده و نوشته می شود. این حالت باید برای همه فایل هایی که شامل متن نیستند استفاده شود.
هنگام خواندن در حالت متن، پیش فرض این است که انتهای خطوط خاص هر پلتفرم (n در Unix، rn در ویندوز) را فقط به n تبدیل کند. هنگام نوشتن در حالت متن، پیش فرض این است که هر جا n وجود دارد را به انتهای خطوط خاص هر پلتفرم بازگرداند. این تغییرات پشت پرده روی داده فایل برای فایل های متنی مشکلی ایجاد نمی کند، اما داده های باینری مانند فایل های JPEG یا EXE را خراب می کند.
در هنگام خواندن و نوشتن چنین فایل هایی بسیار مراقب استفاده از حالت باینری باشید. خوب است هنگام کار با اشیای فایل از کلمه کلیدی with استفاده کنید. مزیت آن این است که پس از اتمام مجموعه فایل، حتی درصورتی که در جایی یک استثنا رخ دهد، فایل به درستی بسته می شود. همچنین استفاده از with بسیار کوتاهتر از نوشتن بلاک try-finally برابر با آن است.
>>> with open('workfile') as f:
... read_data = f.read()
 
>>> # We can check that the file has been automatically closed.
>>> f.closed
True
اگر از کلمه کلیدی with استفاده نمی کنید، پس باید f.close() را فراخوانی کنید تا فایل را ببندد و فورا منابع سیستمی استفاده شده توسط آن را آزاد کند. اگر صریحا یک فایل را نبندید، زباله جمع کن پایتون (Python’s garbage collector) نهایتا شی را نابود می کند و فایل را برای شما می بندد، اما ممکن است برای مدتی فایل باز بماند. احتمال خطر دیگری که وجود دارد این است که پیاده سازی های مختلف پایتون، این عمل تمیز کردن را در زمان های مختلف انجام می دهند. پس از اینکه یک شی فایل بسته شد، تلاش برای استفاده از شی فایل چه از طریق عبارت with یا با فراخوانی f.close() ، به صورت خودکار شکست می خورد.
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "", line 1, in
ValueError: I/O operation on closed file.
آموزش متدهای اشیای فایل در آموزش پایتون
در بقیه مثال های این بخش فرض شده است که یک شی فایل به نام f پیش از این ایجاد شده است. برای خواندن محتویات یک فایل f.read(size) را فراخوانی کنید، که تعدادی داده را می خواند و به صورت یک رشته(در حالت متن) یا شی بایت (در حالت باینری) باز می گرداند.
سایز Size یک آرگومان عددی اختیاری است. زمانی که size حذف شود یا منفی باشد، کل محتویات فایل خوانده و باز گردانده می شود. این مشکل شماست اگر فایل دو برابر بزرگتر از حافظه سیستم شماست. در غیر این صورت، حداکثر اندازه کاراکتر (در حالت متن) یا اندازه بایت(در حالت باینری) خوانده و باز گردانده می شود. اگر به انتهای فایل رسیده باشیم، f.read() یک رشته خالی را باز می گرداند (‘ ‘).
>>> f.read()
'This is the entire file.n'
>>> f.read()
''
دستور f.readline() یک خط از فایل را می خواند. کاراکتر خط جدید (n) در انتهای رشته قرار می گیرد، و فقط زمانی حذف می شود که به آخرین خط فایل رسیده باشیم، و البته اگر فایل با خط جدید(n) تمام نشود. این باعث می شود تا مقدار بازگشتی واضح باشد. اگر f.readline() یک رشته خالی را باز گرداند، به انتهای فایل رسیدیم، در حالی که یک خط خالی توسط n نمایش داده شده است، یک رشته شامل تنها یک خط جدید.
>>> f.readline()
'This is the first line of the file.n'
>>> f.readline()
'Second line of the filen'
>>> f.readline()
''
برای خواندن خطوط از یک فایل، میتوانید روی شی فایل حلقه بزنید. این عمل از نظر حافظه کارآمد است، سریع است و ما را به یک کد ساده می رساند.
>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
اگر می خواهید همه خطوط یک فایل را بخوانید و در یک لیست قرار دهید، می توانید از list(f) یا f.readlines() استفاده کنید. f.write(string) محتویات رشته را درون فایل می نویسد، و تعداد کاراکتر های نوشته شده را باز می گرداند.
>>> f.write('This is a testn')
15
سایر انواع اشیا باید قبل از نوشته شدن، یا به یک رشته (در حالت متن) یا به یک شی بایت (در حالت باینری) تبدیل شوند.
>>> value = ('the answer', 42)
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
دستور f.tell() یک عدد صحیح که مکان فعلی شی فایل را در فایل مشخص می کند، باز می گرداند. این مقدار بازگشتی به صورت عددی از بایت ها از آغاز فایل در حالت باینری و یک عدد opaque در حالت متن، نمایش داده می شود. برای تغییر مکان شی فایل، از f.seek(offset, whence) استفاده کنید.
مکان با افزودن offset به یک نقطه مرجع محاسبه می شود. نقطه مرجع توسط آرگومان whence انتخاب می شود. مقدار 0 برای whence ، از ابتدای فایل می سنجد، 1 از مکان فعلی استفاده می کند، و 2 از انتهای فایل به عنوان نقطه مرجع استفاده می کند. whence می تواند حذف شود و پیش فرض 0 است که از ابتدای فایل به عنوان نقطه مرجع استفاده می کند.
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
در فایل های متنی(آنهایی که بدون b در رشته حالت، باز شده اند)، تنها جستجوهای وابسته به شروع فایل مجاز است (استثنای جستجو از انتهای فایل با seek(0, 2) انجام می شود) و تنها مقادیر معتبر offset آنهایی هستند که یا صفر باشند یا توسط f.tell() باز گردانده شده اند.
هر مقدار offset دیگری، رفتار تعریف نشده ای را تولید می کند. اشیای فایل، متدهای اضافی دیگری هم دارند، مانند isatty() و truncate() که کمتر مورد استفاده قرار میگیرند.
آموزش ذخیره داده ساخت یافته با استفاده از json در آموزش پایتون
رشته ها را می توان به سادگی از فایل خواند یا درون فایل نوشت. اعداد نیاز به تلاش بیشتری دارد، از آنجایی که متد read() فقط رشته باز می گرداند، باید به یک تابع مانند int() پاس داده شود، که یک رشته مانند ‘123’ را می گیرد و مقدار عددی آن یعنی 123 را باز می گرداند. زمانی که بخواهید انواع داده پیچیده تری مانند لیست های تو در تو و دیکشنری ها را ذخیره کنید، پارس کردن (parsing) و سریال سازی دستی پیچیده می شود.
به جای اینکه کاربران مدام به نوشتن و اشکال زدایی کد برای ذخیره انواع داده پیچیده در فایل بپردازند، پایتون به شما این امکان را می دهد تا از فرمت تبادل داده محبوب به نام JSON (نماد شی جاوا اسکریپت)استفاده کنید.
ماژول استاندارد json می تواند سلسله مراتب داده پایتون را بگیرد، و آنها را به نمایش های رشته ای تبدیل کند. این روند سریال سازی (serializing) نام دارد. بازسازی داده از نمایش رشته ای، محصور کردن (deserializing) نام دارد. بین سریال سازی و محصور کردن، رشته ای که نمایشگر شی است ممکن است در یک فایل یا داده ذخیره شده باشد، یا از طریق ارتباطات شبکه به یک سیستم دور فرستاده شده باشد.
توجه !
معمولا برای تبادل داده، فرمت JSON توسط برنامه های کاربردی مدرن استفاده می شود. در حال حاظر بسیاری از برنامه نویسان با آن آشنا هستند، و همین آن را به یک گزینه خوب برای همکاری تبدیل کرده است.
اگر شی x را داشته باشید، می توانید نمایش رشته ای JSON آن را با یک خط کد ساده ببینید:
>>> import json
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'
گونه دیگری از تابع dumps()، dump() نام دارد، که به سادگی شی را به یک فایل متنی سریال سازی می کند. بنابراین اگر f یک شی فایل متنی باشد که برای نوشتن باز شده باشد، می توانیم این کار را انجام دهیم:
json.dump(x, f)
برای رمزگشایی مجدد شی، اگر f یک شی فایل متنی باشد که برای خواندن باز شده باشد:
x = json.load(f)
این روش ساده سریال سازی می تواند لیست ها و دیکشنری ها را مدیریت کند، اما سریال سازی اختیاری نمونه های کلاس در JSON نیاز به کمی تلاش بیشتر دارد. مرجع مربوط به ماژول json در بردارنده توضیحاتی برای این موضوع است.
آموزش خطاها و استثناها در برنامه نویسی پایتون
تا اینجا به پیام های خطا فقط اشاره کردیم، اما اگر مثال ها را انجام داده باشید احتمالا به برخی از آنها برخورده اید. حداقل دو نوع خطای متمایز وجود دارد: خطاهای نحوی(نگارشی- syntax) و استثناها.
آموزش خطاهای نحوی در Python
خطاهای نحوی که همچنین با نام خطاهای parsing نیز شناخته شده هستند، شاید معمول ترین نوع خطا باشد که در حین یادگیری پایتون به آن بر می خورید.
>>> while True print('Hello world')
File "", line 1
while True print('Hello world')
^
SyntaxError: invalid syntax
آموزش Parser در Python
خط دارای خطا را تکرار می کند و یک فلش کوچکی را نمایش می دهد که به اولین نقطه در خط، جایی که خطا تشخیص داده شده است، اشاره می کند. خطا توسط علامتی که قبل از فلش وجود دارد رخ داده است یا حداقل در آن نقطه تشخیص داده شده است.
در این مثال، خطا در تابع print() تشخیص داده شده است، زیرا یک دو نقطه (:) قبل از آن حذف شده است. نام فایل و شماره خط چاپ شده است، بنابراین در صورتی که ورودی از یک script بیاید می دانید کجا به دنبال خطا بگردید.
آموزش استثناها در برنامه نویسی پایتون
حتی اگر یک عبارت یا اصطلاح از نظر نگارشی صحیح باشد، ممکن است زمانی که قصد اجرای آن را داریم، باعث بروز خطا شود. خطاهای تشخیص داده شده در حین اجرا، استثنا نام دارد و بی قید و شرط مهلک نیستند: به زودی نحوه مدیریت آنها در برنامه های پایتون را فرا خواهید گرفت. اغلب استثناها توسط برنامه ها مدیریت نمی شوند، اگرچه منجر به پیام های خطا می شوند که در اینجا نشان داده شده است.
>>> 10 * (1/0)
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "", line 1, in
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't convert 'int' object to str implicitly
آخرین خط در پیام خطا، بیان می کند که چه اتفاقی افتاده است. استثناها انواع مختلفی دارند، و نوع آنها به عنوان بخشی از پیام چاپ می شود.
نوع خطاها در این مثال ZeroDivisionError ، NameError و TypeError است. رشته چاپ شده به عنوان نوع استثنا، نام استثنای داخلی (built-in exception) است که رخ داده. این امر برای همه استثناهای داخلی صحت دارد، اما نیاز نیست برای استثناهای تعریف شده توسط کاربر نیز صحت داشته باشد (هرچند این یک قرارداد مفید است).
به طور کلی شامل یک ردیابی پشته ای است که خطوط کد را لیست می کند. اگر چه خطوط خوانده شده از ورودی استاندارد را نمایش نمی دهد. لینک Built-in Exceptions استثناهای درونی را بر می شمارد و معانی آنها را می گوید.
آموزش مدیریت استثناها در آموزش پایتون
نوشتن برنامه هایی که استثناهای انتخاب شده را مدیریت کند امکان پذیر است. مثال زیر را ببینید که تا زمان دریافت عدد صحیح معتبر، از کاربر درخواست ورودی می کند.
اما به کاربر این امکان را می دهد که برنامه را قطع کند (با استفاده از کنترل +C و یا هر آنچه که سیستم عامل پشتیبانی می کند). توجه داشته باشید این قطع شدن برنامه که توسط کاربر رخ داده است با اعلام استثنای KeyboardInterrupt شناسانده می شود.
>>> while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
...
عبارت try به صورت زیر کار می کند.
  • ابتدا، بخش try (عبارات بین دو کلمه کلیدی try و except) اجرا می شود.
  • اگر هیچ استثنایی رخ ندهد، از روی بخش except می پرد( این بخش اجرا نمی شود) و اجرای عبارت try تمام می شود.
  • اگر در حین اجرای بخش try استثنایی رخ دهد، از اجرای بقیه این بخش صرف نظر می کند. سپس اگر نوع خطای رخ داده با نام خطای نوشته شده پس از کلمه کلیدی except یکسان باشد، بخش except اجرا می شود، و سپس اجرا از پس از عبارت try ادامه می یابد.
  • اگر استثنایی رخ دهد که مشابه نام استثنا در بخش except نباشد، به خارج از عبارات بخش try منتقل می شود. اگر هیچ بخش مدیریتی (handler) وجود نداشته باشد، یک استثنای مدیریت نشده رخ داده است و اجرا با پیامی که در بالا نشان داده شده است متوقف می شود.
یک عبارت try ممکن است برای مدیریت استثناهای مختلف، بیشتر از یک بخش except داشته باشد. حداکثر یک بخش مدیریتی اجرا خواهد شد. بخش های مدیریتی، تنها استثناهای رخ داده شده در بخش try مربوطه را مدیریت می کنند، نه در سایر بخش های مدیریتی از عبارت try مشابه. یک بخش استثنا ممکن است چندین استثنا را در قالب یک چندتایی پرانتز دار نام ببرد. برای مثال:
... except (RuntimeError, TypeError, NameError):
... pass
یک کلاس درون یک بخش except ، با یک استثنا سازگار است، اگر همان کلاس مشابه یا یک کلاس پایه باشد. (اما عکس آن صادق نیست- یک بخش except که یک کلاس مشتق شده را لیست کرده است با یک کلاس پایه سازگار نیست). برای مثال، کد زیر B ,C ,D را به این ترتیب چاپ می کند.
class B(Exception):
pass
 
class C(B):
pass
 
class D(C):
pass
 
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
 
توجه داشته باشید که اگر بخش های except معکوس شوند ( اول except B باشد)، B,B,B چاپ می شد—اولین بخش except فعال شده است.
آخرین بخش except ممکن است نام استثنا(ها) را حذف کند. از این قابلیت با احتیاط بسیار استفاده کنید، زیرا پنهان شدن یک خطای واقعی برنامه نویسی از این طریق به سادگی امکان پذیر است. همچنین از آن می توان برای چاپ یک پیام خطا و اعلام دوباره آن استثنا استفاده کرد (همچنین اجازه به فراخواننده برای مدیریت استثنا).
import sys
 
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
عبارت try … except دارای یک بخش else اختیاری است که در صورت وجود باید از همه بخش های استثنا پیروی کند. این برای کدی که بخش try آن استثنایی اعلام نکرده و باید اجرا شود، مفید است. برای مثال:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
 
استفاده از بخش else بهتر از افزودن کد اضافی به بخش try است، زیرا آن از گرفتن تصادفی استثنایی که توسط کدی که با عبارت try … except محافظت می شود، جلوگیری میکند. زمانی که یک استثنا رخ می دهد، ممکن است یک مقدار وابسته داشته باشد، که به عنوان آرگومان استثنا نیز شناخته می شود.
حضور و نوع آرگومان به نوع استثنا بستگی دارد. بخش except ممکن است یک متغیر را بعد از نام استثنا مشخص کند. متغیر به یک نمونه استثنا (exception instance) محدود است و آرگومان ها در instance.args ذخیره می شوند.
.برای سادگی، نمونه استثنا __str__() را تعریف می کند، بنابراین آرگومان ها می توانند مستقیما بدون نیاز به ارجاع به .args چاپ شوند. همچنین ممکن است ابتدا پیش از اعلام یک استثنا، مقدار دهی اولیه شود و هر ویژگی دلخواه به آن اضافه شود.
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print(type(inst)) # the exception instance
... print(inst.args) # arguments stored in .args
... print(inst) # __str__ allows args to be printed directly,
... # but may be overridden in exception subclasses
... x, y = inst.args # unpack args
... print('x =', x)
... print('y =', y)
...
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
اگر یک استثنا دارای آرگومان باشد، آنها همانند بخش آخر (‘detail’) پیام برای استثناهای مدیریت نشده، چاپ می شوند. بخش مدیریت استثنا فقط استثناها را در صورت وقوع فوری در بخش try مدیریت نمیکند، بلکه اگر درون توابع بخش try فراخوانی شوند یا حتی مستقیما در آن توابع رخ دهند نیز مدیریت می شوند. برای مثال:
>>> def this_fails():
... x = 1/0
...
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print('Handling run-time error:', err)
...
Handling run-time error: division by zero
آموزش پایتون ادامه دارد

آموزش پایتون رایگان

۸۴ بازديد

سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم

  • آموزش ساختار های داده
  • استفاده از لیست ها به عنوان صف در پایتون
  • آموزش عبارت del در زبان برنامه نویسی پایتون

با ادامه آموزش پایتون همراه ما باشید.

آموزش دنباله ها و چندتایی ها (tuples) در زبان برنامه نویسی پایتون

دیدیم که لیست ها و رشته ها خصیصه های مشترک بسیاری داشتند، مانند عملیات اندیس گذاری و بخش بندی (slicing) . آنها دو مثال از انواع داده دنباله هستند

از آنجایی که پایتون یک زبان در حال تحول است، سایر انواع داده دنباله ممکن است اضافه شود. همچنین یک نوع داده دنباله استاندارد دیگر به نام چندتایی وجود دارد. یک چندتایی شامل تعدادی مقدار است که به وسیله ویرگول از هم جدا شده اند. برای مثال:

1 >>> t = 12345, 54321, 'hello!'
1    >>> t[0]
1    12345
1    >>> t
1    (12345, 54321, 'hello!')
1    >>> # Tuples may be nested:
1    ... u = t, (1, 2, 3, 4, 5)
1    >>> u
1    ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
1    >>> # Tuples are immutable:
1    ... t[0] = 88888
1    Traceback (most recent call last):
1      File "", line 1, in 
1    TypeError: 'tuple' object does not support item assignment
1    >>> # but they can contain mutable objects:
1    ... v = ([1, 2, 3], [3, 2, 1])
1    >>> v
1    ([1, 2, 3], [3, 2, 1])
1

همانطور که می بینید ، چندتایی ها در خروجی همیشه در پرانتز قرار دارند، بنابراین چندتایی های تو در تو به درستی تفسیر می شوند. آنها ممکن است در ورودی با یا بدون پرانتز باشند، هرچند اغلب، پرانتز ها ضروری هستند (اگر چندتایی بخشی از یک عبارت بزرگتر باشد). امکان تخصیص به عناصر یک چندتایی به صورت مجزا وجود ندارد، هرچند می توان چندتایی هایی ساخت که شامل اشیای قابل تغییر باشند، مانند لیست ها.

اگرچه ممکن است چندتایی ها شبیه لیست ها به نظر برسند، اما اغلب در موقعیت های مختلف و برای اهداف متفاوتی از چندتایی ها استفاده می شود. چندتایی ها غیر قابل تغییر هستند، و معمولا در بر دارنده دنباله ای از عناصر نا همگن هستند که به وسیله باز کردن (unpacking- در ادامه این بخش می بینیم) یا اندیس گذاری (یا حتی توسط ویژگی در صورت namedtuples) قابل دسترسی هستند.

لیست ها قابل تغییر هستند، و عناصر آنها معمولا همگن هستند و با گردش و تکرار روی لیست قابل دسترسی هستند. مشکل ویژه ساختار چندتایی ها در شرایطی است که شامل صفر یا یک عنصر هستند. نحوه نگارش، تعدادی جایگزین برای اصلاح این مشکل دارد. چندتایی های خالی به وسیله یک جفت پرانتز خالی ساخته می شوند. چندتایی با یک عنصر ، به وسیله یک مقدار و یک ویرگول پس از آن ساخته می شود ( قرار دادن یک مقدار در پرانتز کارآمد نیست). زشت اما موثر. برای مثال:

1>>> empty = ()
1>>> singleton = 'hello',    # <-- note trailing comma
1>>> len(empty)
10
1>>> len(singleton)
11
1>>> singleton
1('hello',)

عبارت t = 12345, 54321, 'hello!' یک مثال از بسته بندی چندتایی است. مقادیر 12345 ، 54321 و 'hello!' با هم در یک چندتایی بسته بندی شده اند. عملیات عکس آن نیز امکان پذیر است:

1>>> x, y, z = t

این باز کردن دنباله (sequence unpacking) نام دارد و برای هر دنباله در سمت راست (right-hand side) کار می کند. باز کردن دنباله نیازمند این است که به تعداد عناصر موجود در دنباله، متغیر در سمت چپ علامت مساوی باشد. توجه کنید که تخصیص های متعدد فقط ترکیبی از بسته بندی چندتایی و باز کردن دنباله است.

آموزش مجموعه ها (set) در آموزش پایتون

همچنین پایتون شامل یک نوع داده برای مجموعه ها است.

کاربردهای اصلی شامل تست عضویت و حذف ورودی های تکراری است. همچنین اشیای مجموعه از عملیات ریاضی مانند اجتماع, اشتراک, تفاضل و تفاضل متقارن پشتیبانی می کند. از پرانتز {} یا تابع set() برای ساخت مجموعه می توان استفاده کرد. نکته: برای ایجاد یک مجموعه خالی باید از set() استفاده کنید نه {}. دومی یک دیکشنری خالی می سازد، ساختار داده ای که در بخش بعدی درباره آن بحث می کنیم. در اینجا یک نمایش مختصر داریم:

1>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
1>>> print(basket)                      # show that duplicates have been removed
1{'orange', 'banana', 'pear', 'apple'}
1>>> 'orange' in basket                 # fast membership testing
1True
1>>> 'crabgrass' in basket
1False
1 
1>>> # Demonstrate set operations on unique letters from two words
1...
1>>> a = set('abracadabra')
1>>> b = set('alacazam')
1>>> a                                  # unique letters in a
1{'a', 'r', 'b', 'c', 'd'}
1>>> a - b                              # letters in a but not in b
1{'r', 'd', 'b'}
1>>> a | b                              # letters in a or b or both
1{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
1>>> a & b                              # letters in both a and b
1{'a', 'c'}
1>>> a ^ b                              # letters in a or b but not both
1{'r', 'd', 'b', 'm', 'z', 'l'}

مشابه درک مطلب لیست، درک مطلب مجموعه ها نیز پشتیبانی می شود:

1>>> a = {x for x in 'abracadabra' if x not in 'abc'}
1>>> a
1{'r', 'd'}

آموزش دیکشنری ها در برنامه نویسی پایتون

نوع داده مفید دیگری که درون پایتون ساخته شده دیکشنری است

بعضی اوقات در سایر زبان ها مانند “associative memories” و “associative arrays” نیز دیکشنری پیدا می شود. برخلاف دنباله ها که با بازه ای از اعداد اندیس گذاری می شوند، دیکشنری ها با کلیدها اندیس گذاری می شوند که این کلیدها می توانند هر نوع غیر قابل تغییری باشند. رشته ها و اعداد همیشه می توانند کلید باشند. چندتایی ها در زمانی که تنها شامل رشته ها، اعداد و چندتایی های دیگر باشند، می توانند کلید باشند.

اگر چندتایی شامل هر گونه شی قابل تغییر ، مستقیم یا غیر مستقیم باشد، نمیتواند به عنوان کلید مورد استفاده قرار گیرد. از لیست ها نمی توان به عنوان کلید استفاده کرد زیرا آنها با استفاده از تخصیص اندیس، تخصیص بخش (slice) یا با استفاده از متدهای append() و extend() می توانند تغییر کنند.

بهتر است به دیکشنری به عنوان مجموعه ای از جفت "کلید:مقدار" نگاه کنیم با این شرط که کلید ها (درون یک دیکشنری) یکتا هستند. یک جفت پرانتز {} یک دیکشنری خالی ایجاد می کند. قرار دادن لیستی از جفت کلید:مقدار که با ویرگول از هم جداشده اند درون پرانتز ها ، کلید:مقدار اولیه را به دیکشنری اضافه می کند. همچنین دیکشنری ها در خروجی به این روش نوشته می شوند.

عملیات اصلی روی یک دیکشنری، ذخیره یک مقدار با یک کلید و استخراج آن مقدار با دادن کلید است. همچنین می توان با del یک جفت کلید:مقدار را پاک کرد. اگر یک مقدار را با استفاده از یک کلیدی که در حال حاضر موجود و در حال استفاده است ذخیره کنید، مقدار قبلی مربوط به آن کلید فراموش می شود. استخراج یک مقدار توسط کلیدی که وجود ندارد خطا است.

اگر list(d) را روی یک دیکشنری اعمال کنید، یک لیست از تمامی کلیدهای موجود در دیکشنری به ترتیب درج باز می گرداند ( اگر میخواهید که مرتب شود به جای آن از sorted(d) استفاده کنید). برای بررسی اینکه آیا یک کلید در دیکشنری وجود دارد از کلمه کلیدی in استفاده کنید. در اینجا مثالی کوچک که از دیکشنری استفاده کرده است را می بینیم:

1>>> tel = {'jack': 4098, 'sape': 4139}
1>>> tel['guido'] = 4127
1>>> tel
1{'jack': 4098, 'sape': 4139, 'guido': 4127}
1>>> tel['jack']
14098
1>>> del tel['sape']
1>>> tel['irv'] = 4127
1>>> tel
1{'jack': 4098, 'guido': 4127, 'irv': 4127}
1>>> list(tel)
1['jack', 'guido', 'irv']
1>>> sorted(tel)
1['guido', 'irv', 'jack']
1>>> 'guido' in tel
1True
1>>> 'jack' not in tel
1False

سازنده dict() مستقیما از دنباله های جفت کلید:مقدار دیکشنری می سازد.

1>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
1{'sape': 4139, 'guido': 4127, 'jack': 4098}

علاوه بر آن از درک مطلب دیکشنری (dict comprehensions) برای ساخت دیکشنری ها از عبارات کلید:مقدار دلخواه می توان استفاده کرد.

1>>> {x: x**2 for x in (2, 4, 6)}
1{2: 4, 4: 16, 6: 36}

گاهی ساده تر است، زمانی که کلیدها رشته های ساده هستند، جفت ها را با آرگومان های کلمه کلیدی مشخص کنیم:

1>>> dict(sape=4139, guido=4127, jack=4098)
1{'sape': 4139, 'guido': 4127, 'jack': 4098}

آموزش تکنیک های حلقه در برنامه نویسی python

هنگامی که در دیکشنری ها از حلقه استفاده شود، می توان با استفاده از متد items() کلید و مقدار متناظر با آن را به طور همزمان بازیابی کرد.

1>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
1>>> for k, v in knights.items():
1...     print(k, v)
1...
1gallahad the pure
1robin the brave

هنگامی که در یک دنباله از حلقه استفاده شود، با استفاده از تابع enumerate() میتوان اندیس مکان و مقدار متناظر با آن را به صورت همزمان بازیابی کرد.

1>>> for i, v in enumerate(['tic', 'tac', 'toe']):
1...     print(i, v)
1...
10 tic
11 tac
12 toe

برای حلقه زدن روی دو یا بیشتر دنباله به صورت همزمان، ورودی ها با استفاده از تابع zip() می توانند جفت شوند.

1>>> questions = ['name', 'quest', 'favorite color']
1>>> answers = ['lancelot', 'the holy grail', 'blue']
1>>> for q, a in zip(questions, answers):
1...     print('What is your {0}?  It is {1}.'.format(q, a))
1...
1What is your name?  It is lancelot.
1What is your quest?  It is the holy grail.
1What is your favorite color?  It is blue.

برای حلقه زدن روی یک دنباله به صورت معکوس، ابتدا دنباله را در جهت رو به جلو مشخص کنید، سپس تابع reversed() را فراخوانی کنید.

1>>> for i in reversed(range(1, 10, 2)):
1...     print(i)
1...
19
17
15
13
11

برای حلقه زدن روی یک دنباله به صورت مرتب شده، از تابع sorted() استفاده کنید که یک لیست جدید مرتب شده را باز می گرداند و در دنباله اولیه تغییری ایجاد نمی کند.

1>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
1>>> for f in sorted(set(basket)):
1...     print(f)
1...
1apple
1banana
1orange
1pear

گاهی اوقات تغییر یک لیست زمانی که در حال استفاده از حلقه روی آن هستید، تحریک کننده است. هر چند اغلب ایجاد یک لیست جدید به جای آن ساده تر و امن تر است.

1>>> import math
1>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
1>>> filtered_data = []
1>>> for value in raw_data:
1...     if not math.isnan(value):
1...         filtered_data.append(value)
1...
1>>> filtered_data
1[56.2, 51.7, 55.3, 52.5, 47.8]

 

مباحث بیشتر درباره شرط ها در برنامه نویسی Python

شروط استفاده شده در عبارات while و if می تواند شامل هر عملگری باشد، نه فقط مقایسه. عملگرهای مقایسه ای in و not in وجود و عدم وجود یک مقدار درون یک دنباله را بررسی می کنند.

عملگرهای is و is not مقایسه می کنند که آیا دو شی واقعا مشابه هستند یا خیر، این تنها برای اشیای قابل تغییر مانند لیست ها اهمیت دارد. تمامی عملگرهای مقایسه ای اولویت یکسانی دارند، که از عملگرهای عددی پایین تر است. مقایسه ها می توانند به طور زنجیره ای به هم متصل شوند.

برای مثال a < b == c بررسی می کند که آیا a کمتر از b است و علاوه بر آن b مساوی c است. مقایسه ها ممکن است با استفاده از عملگرهای بولی (Boolean) مانند and و or ترکیب شوند، و خروجی مقایسه (یا هر عبارت بولی دیگر) با استفاده از not منفی شود. اینها نسبت به عملگرهای مقایسه ای اولویت پایین تری دارند.

بین آنها، not بالاترین اولویت و or پایین ترین اولویت را دارد، بنابراین A and not B or C برابر است با (A and (not B)) or C. مثل همیشه، از پرانتز ها برای بیان ترکیب بندی دلخواه می توان استفاده کرد. عملگرهای بولی and و or عملگرهای مدار کوتاه نیز نامیده می شوند. آرگومان های آنها از چپ به راست بررسی می شوند، و به محض تعیین خروجی، بررسی متوقف می شود.

برای مثال، اگر a و c صحیح (true) باشند اما b غلط باشد (false)،A and B and C عبارت c را بررسی نمی کند. زمانی که به عنوان یک مقدار عمومی نه بولی مورد استفاده قرار می گیرد، مقدار بازگشتی یک عملگر مدار کوتاه، آخرین آرگومان بررسی شده است. می توان نتیجه یک مقایسه یا سایر عبارات بولی را به یک متغیر، تخصیص داد. برای مثال:

 

1>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
1>>> non_null = string1 or string2 or string3
1>>> non_null
1'Trondheim'

توجه داشته باشید که در پایتون، بر خلاف C ، تخصیص درون عبارات باید صراحتا توسط عمگر =: انجام شود. با این کار از یک کلاس مشترک از اشتباهات مواجه شده در برنامه نویسی C جلوگیری می شود. نوشتن = در یک عبارت، در حالی که منظور == بوده است.

آموزش پایتون ادامه دارد

 

آموزش پایتون از صفر تا 100

۷۵ بازديد

سلام دوستان ...در قسمت قبل آموزش پایتون مفاهیم زیر را یاد دادیم

  • معرفی زبان برنامه نویسی پایتون
  • فراخوانی مفسر در زبان برنامه نویسی پایتون
  • حالت تعاملی در Python
  • آموزش استفاده از رمزنگاری متن کد در مفسر پایتون
  • استفاده از پایتون به عنوان ماشین حساب
  • رشته ها در برنامه نویسی python
  • لیست ها در برنامه نویسی python

حال با ادامه آموزش پایتون همراه ما باشید.

مراحل اولیه برای برنامه نویسی پایتون Python

1البته که می توان از پایتون برای کارهای پیچیده تر از دو به اضافه دو استفاده کرد. برای مثال، می توان یک زیر دنباله اولیه سری فیبوناتچی را به صورت زیر نوشت:
1>>> # Fibonacci series:
1... # the sum of two elements defines the next
1... a, b = 0, 1
1>>> while a < 10:
1...     print(a)
1...     a, b = b, a+b
1...
10
11
11
12
13
15
18

این مثال چندین ویژگی جدید را معرفی می کند

1. خط اول شامل چندین تخصیص است: متغیر های a وb به طور همزمان مقادیر جدید صفر و یک را می گیرند. در خط آخر نیز مجددا از این گونه تخصیص استفاده شده است که نشان دهنده این است که ابتدا همه عبارات سمت راست قبل از هر گونه تخصیص دادن محاسبه می شوند. عبارات سمت راست، از چپ به راست محاسبه می شوند.

2. حقله while تا زمانی که شرط (در اینجا a < 10) صحیح (true) باشد اجرا می شود. در پایتون همانند C، هر مقدار صحیح(integer) غیر صفر صحیح (true) است. صفر غلط(false) است . شرط نیز ممکن است مقدار رشته یا لیست باشد؛ در واقع هر داده ترتیبی می تواند باشد. هر چیزی با طول غیر صفر صحیح و دنباله های خالی غلط هستند. تست استفاده شده در این مثال یک مقایسه ساده است. عملگرهای مقایسه ای استاندارد مشابه C نوشته می شوند. < کمتر از ، > بزرگتر از ، == تساوی ، <= کمتر مساوی ، >= بزرگتر مساوی ، =! نا مساوی.

3. بدنه حلقه فرورفتگی دارد. فرو رفتگی روش پایتون برای دسته بندی عبارات است. در prompt تعاملی، برای هر خط فرو رفته باید یک tab یا چندین فاصله تایپ کنید. در عمل به وسیله ویرایشگر متن، ورودی های پیچیده تری را برای پایتون آماده می کنید. همه ویرایشگر های متن محبوب دارای تسهیلات ایجاد فرورفتگی خودکار هستند. زمانی که یک عبارت ترکیبی به صورت تعاملی وارد شود، یک خط خالی باید پس آن وجود داشته باشد که نشان دهنده تکمیل آن باشد (زیرا پارسر(parser)نمیتواند حدس بزند که شما چه زمانی خط آخر را نوشته اید). توجه داشته باشید که همه خطوط درون یک بلاک باید به یک اندازه فرو رفته باشند.

4. تابع print() مقدار آرگومان هایی که به آن داده شده را چاپ می کند. عملکرد این تابع متفاوت است از نوشتن ساده عبارات مورد نظر(مانند نوشتن در مثال ماشین حساب). دلیل این تفاوت نحوه مدیریت چندین آرگومان، مقادیر اعشاری و رشته ها توسط این تابع است. رشته ها بدون علامت نقل قول چاپ می شوند و در بین موارد فاصله قرار می گیرد ، بنابراین می توانید به همه چیز به زیبایی شکل دهید. مانند این:

1>>> i = 256*256
1>>> print('The value of i is', i)
1The value of i is 65536

از آرگومان کلمه کلیدی end برای جلوگیری از اعمال خط جدید پس از خروجی می توان استفاده کرد و یا می توان خروجی را با یک رشته متفاوت اتمام کرد.

1>>> a, b = 0, 1
1>>> while a < 1000:
1...     print(a, end=',')
1...     a, b = b, a+b
1...
10,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

توجه !

1. از آنجایی که ** اولویت بالاتری نسبت به – دارد، -3**2 به صورت -(3**2) تفسیر می شود ، پس بنابراین نتیجه -9 می شود. برای جلوگیری از این اتفاق و رسیدن به نتیجه 9، می توان از (-3)**2 استفاده کرد.

2. بر خلاف سایر زبان ها، کاراکتر های خاص مانند n با هر دوی نقل قول تکی ('...') و دوتایی ("...") معنای یکسان دارند. تنها تفاوت در این دو این است که در نقل قول تکی نیازی به گریز از " نیست( اما باید از ’ گریز کرد) و بالعکس.

ابزارهای کنترل در زبان پایتون Python

آموزش عبارات if در زبان برنامه نویسی Python

شاید شناخته شده ترین نوع عبارات، عبارت if باشد. برای مثال:

1>>> x = int(input("Please enter an integer: "))
1Please enter an integer: 42
1>>> if x < 0:
1...     x = 0
1...     print('Negative changed to zero')
1... elif x == 0:
1...     print('Zero')
1... elif x == 1:
1...     print('Single')
1... else:
1...     print('More')
1...

میتوان به تعداد دلخواه (هیچ یا بیشتر ) بخش elif قرار داد، و بخش else اختیاری است. کلمه کلیدی elif خلاصه شده else if است، و بهتر است از اعمال فرورفتگی اضافی خودداری شود. یک دنباله if….elif….elif…. جایگزینی برای عبارات switch یا case موجود در سایر زبان ها است.

آموزش عبارات for در زبان برنامه نویسی Python

عبارات for در پایتون با آنچه که در C یا پاسکال استفاده می کردید، ممکن است کمی متفاوت باشد. به جای روند تکرار همیشگی که روی دنباله ای از اعداد حسابی که به صورت افزایشی تغییر میکند (مانند پاسکال)، یا به جای دادن این امکان به کاربر که بتواند گام تکرار و شرط پایان حلقه را مشخص کند (مانند C)، عبارت for در پایتون روی موارد هر نوع دنباله ای ( یک رشته یا یک لیست)، بر اساس همان ترتیبی که در دنباله قرار دارند، تکرار می شوند. برای مثال:

1>>> # Measure some strings:
1... words = ['cat', 'window', 'defenestrate']
1>>> for w in words:
1...     print(w, len(w))
1...
1cat 3
1window 6
1defenestrate 12

کدی که یک مجموعه را تغییر می دهد و همزمان روی عناصر همان مجموعه تکرار می کند (درون حلقه for)، می تواند برای اجرای صحیح چالش بر انگیز باشد. به جای آن، معمولا سر راست تر است که روی یک کپی از مجموعه حلقه بزنید یا یک مجموعه جدید ایجاد کنید.

1# Strategy:  Iterate over a copy
1for user, status in users.copy().items():
1    if status == 'inactive':
1        del users[user]
1 
1# Strategy:  Create a new collection
1active_users = {}
1for user, status in users.items():
1    if status == 'active':
1        active_users[user] = status

آموزش تابع range() در برنامه نویسی پایتون

اگر احتیاج دارید که روی دنباله ای از اعداد در حلقه تکرار کنید، تابع داخلی range() به کار می آید. این تابع توالی از اعداد حسابی تولید می کند.

1>>> for i in range(5):
1...     print(i)
1...
10
11
12
13
14

نقطه پایان داده شده هیچگاه جزء ای از دنباله تولید شده نیست. Range(10) ده مقدار تولید می کند که اندیس های مجاز برای عناصر یک دنباله به طول ده هستند. امکان دارد که بخواهیم بازه از عددی دیگر شروع شود، و یا یک واحد افزایشی متفاوت مشخص کنیم (حتی منفی، گاهی به آن گام می گویند).

1range(5, 10)
1   5, 6, 7, 8, 9
1 
1range(0, 10, 3)
1   0, 3, 6, 9
1 
1range(-10, -100, -30)
1  -10, -40, -70

برای تکرار روی اندیس های یک دنباله، می توانید range() و len() را مانند زیر ترکیب کنید:

1>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
1>>> for i in range(len(a)):
1...     print(i, a[i])
1...
10 Mary
11 had
12 a
13 little
14 lamb

اگر چه در بیشتر این موراد، راحت تر است از تابع enumerate() استفاده شود. لینک Looping Techniques را ببینید. اگر فقط یک range را چاپ کنید، اتفاق عجیبی می افتد:

1>>> print(range(10))
1range(0, 10

شی باز گردانده شده توسط تابع range() به طرق مختلف به صورت یک لیست رفتار می کند، در حالی که واقعا لیست نیست. شی ای است که عناصر پی در پی دنباله مورد نظر را در زمان تکرار در حلقه باز می گرداند. اما واقعا یک لیست نیست، بدین ترتیب در ذخیره فضا صرفه جویی می کند. می گوییم چنین شی ای قابل تکرار است، یعنی به عنوان هدف برای توابع و ساختار هایی که انتظار چیزی را دارند که بتوان از آن عناصر ترتیبی به دست آورد تا هنگامی که عناصر خاتمه یابند ، مناسب است. دیدیم که عبارت for دارای این چنین ساختاری است، درحالی که یک مثال از یک تابع که یک شی قابل تکرار را پذیرفته تابع sum() است:

1>>> sum(range(4))  # 0 + 1 + 2 + 3
16

در ادامه با توابع بیشتری آشنا خواهیم شد که تکرار پذیر ها را به عنوان آرگومان دریافت می کنند و آنها را باز می گردانند. در انتها شاید کنجکاو باشید بدانید چگونه از یک range یک لیست بگیرید. و این راه حل است:

1>>> list(range(4))
1[0, 1, 2, 3]

در بخش ساختار های داده، جزییات بیشتری درباره list() ارائه می دهیم.

آموزش پایتون ادامه دارد

آموزش پایتون

۶۹ بازديد

پایتون یک زبان برنامه نویسی قوی و ساده برای یادگیری است. پایتون دارای ساختارهای داده سطح بالای کارآمد و یک راهکار ساده اما موثر برای برنامه نویسی شی گرا است. نحو ظریف پایتون و تایپ پویای آن، به همراه طبیعت مفسر گونه آن، پایتون را تبدیل به یک زبان ایده آل برای برنامه نویسی و توسعه سریع برنامه های کاربردی در بسیاری از حوزه ها و در اکثر پلتفورم ها کرده است. مفسر پایتون و کتابخانه استاندارد گسترده آن برای اکثر پلتفورم ها در وب سایت پایتون به آدرس https://www.python.org/ به صورت رایگان در دسترس است و امکان توزیع رایگان آن نیز ممکن است. مفسر پایتون با توابع جدید و به سادگی قابل توسعه است. در آموزش پایتون مفاهیم اولیه و ویژگی های زبان و سیستم پایتون به صورت غیر رسمی به خواننده معرفی می شود. داشتن یک مفسر پایتون برای تجربه های دم دستی به کار می آید، اما تمامی مثال ها کامل و موجود هستند، بنابراین این آموزش را به صورت آفلاین نیز می توانید بخوانید. برای توصیف اشیا و ماژول ها استاندارد، کتابخانه استاندارد پایتون را ببینید. مرجع زبان پایتون تعاریف رسمی تری از زبان ارائه می کند. همچنین کتاب های متعددی که پایتون را به طور عمیق پوشش می دهند وجود دارد. این آموزش سعی در کامل بودن و پوشش تمامی ویژگی ها، یا حتی ویژگی های معمول و پر استفاده پایتون را ندارد. در عوض، بسیاری از ویژگی های پر ارزش زبان پایتون را معرفی می کند و یک دید خوبی از ساختار زبان به شما خواهد داد. پس از خواندن این آموزش، شما قادر به خواندن و نوشتن ماژول ها و برنامه های پایتون خواهید بود. همچنین برای یادگیری بیشتر درباره ماژول های متنوع کتابخانه پایتون موجود در کتابخانه استاندارد پایتون آماده خواهید بود. نگاهی به فهرست خالی از لطف نخواهد بود.

 

فراخوانی مفسر در زبان برنامه نویسی پایتون

مفسر پایتون معمولا در /usr/local/bin/python3.8 نصب می شود (روی ماشین هایی که این مسیر در دسترس است). با قرار دادن /usr/local/bin در مسیر جستجو پوسته Unix و با نوشتن دستور python3.8 در پوسته می توانید شروع کنید

از آنجایی که انتخاب محل قرار گیری مفسر یک گزینه نصب است، مکان های دیگر نیز ممکن است. این موضوع را با راهنمای محلی پایتون یا مدیر سیستم بررسی کنید. (به عنوان مثال /usr/local/python یک مکان متداول برای قرار گیری است).

بر روی سیستم های ویندوز که پایتون را از آدرس Microsoft Store نصب کرده اید، دستور python3.8 در دسترس خواهد بود

. اگر راه انداز py.exe را نصب کرده اید، می توانید از دستور py استفاده کنید.

 

قسمت Excursus: Setting environment variables را ببینید تا سایر روش ها برای راه اندازی پایتون را ببینید.

تایپ یک کاراکتر end-of-life (کنترلD در Unix و کنترلZ در ویندوز) در primary prompt باعث می شود تا مفسر با خروج حالت صفر خارج شود. اگر کار نکرد، می توانید با نوشتن دستور quit() از مفسر خارج شوید. ویژگی های تصحیح خطوط مفسر شامل تصحیح تعاملی، جایگزینی تاریخچه و تکمیل کد روی سیستم هایی که از کتابخانه GNU Readline پشتیبانی می کند، می باشد. شاید سریع ترین راه برای بررسی اینکه آیا تصحیح خطوط دستور پشتیبانی می شود، نوشتن کنترلP در اولین prompt پایتون که به آن دسترسی دارید باشد. اگر بوق بزند، شما تصحیح خطوط دستور دارید.

اگر هیچ اتفاقی نیافتد، یا ^P تکرار شود، تصحیح خطوط دستور قابل استفاده نیست. شما تنها می توانید با استفاده از کلید backspace کاراکتر ها را از خط فعلی حذف کنید. مفسر چیزی شبیه به پوسته Unix عمل می کند: زمانی که با ورودی استاندارد متصل به دستگاه tty فراخوانی شود، دستورات را به صورت تعاملی می خواند و اجرا می کند. زمانی که با آرگومان نام فایل یا یک فایل به عنوان ورودی استاندارد فراخوانی شود، یک اسکریپت را از آن فایل می خواند و اجرا می کند.

روش دوم برای شروع مفسر python -c command [arg] ... است، که دستور(ها) را، مشابه گزینه -c پوسته در command اجرا می کند. از آنجایی که عبارات پایتون اغلب شامل فاصله یا سایر کاراکتر هایی است که برای پوسته خاص هستند، معمولا توصیه می شود command را در کل با نقل قول تکی، نقل قول کنیم. برخی از ماژول های پایتون در قالب اسکریپت نیز مفید هستند. اینها می توانند با استفاده از python -m module [arg] ... فراخوانی شوند، که فایل کد را برای ماژول اجرا می کند، انگار که نام کامل آن را در خط دستور نوشته باشید. زمانی که از یک فایل اسکریپت استفاده می شود، گاهی اوقات مفید است که بتوانیم اسکریپت را اجرا و سپس حالات تعاملی را وارد کنیم. با پاس دادن -i قبل از اسکریپت می توان این کار را انجام داد. تمامی گزینه های خط دستور در Command line and environment توضیح داده شده است.

آموزش پایتون - پاس دادن آرگومان در زبان برنامه نویسی پایتون

هنگامی که برای مفسر شناخته شده باشید، نام اسکریپت و آرگومان های اضافی به لیستی از رشته ها(strings) تبدیل می شوند و به متغییر argv در ماژول sys تخصیص داده می شوند. با اجرای import sys می توانید به این لیست دسترسی پیدا کنید.

طول این لیست حداقل یک است. زمانی که هیچ اسکریپت و آرگومانی داده نشده باشد، sys.argv[0] یک رشته خالی است. زمانی که نام اسکریپت به صورت '-' ( به معنی ورودی استاندارد) داده شده باشد، مقدار sys.argv[0] ، '-' می شود. زمانی که از دستور –c استفاده شود، مقدار sys.argv[0] ، '-c' می شود. زمانی که از ماژول –m استفاده شود، مقدار sys.argv[0] ، نام کامل ماژول قرار داده شده می شود. گزینه های بعد از دستور –c و ماژول –m توسط پردازش گزینه مفسر پایتون استفاده نمی شود اما برای اینکه توسط دستور یا ماژول مدیریت شود در sys.argv قرار میگیرد.

حالت تعاملی در Python

زمانی که دستورات از یک tty خوانده شده باشند، گفته می شود که مفسر در حالت تعاملی است. در این حالت، با primary prompt آماده دستور بعدی می شود، معمولا سه علامت بزرگتر از (>>>) . برای خطوط پشت سر هم توسط secondary prompt آماده می شود، به صورت پیش فرض سه نقطه (...). مفسر یک پیام خوش آمد گویی با بیان شماره نسخه خود و اعلان حق کپی برداری را قبل از چاپ اولین prompt چاپ می کند.

1$ python3.8
1Python 3.8 (default, Sep 16 2015, 09:25:04)
1[GCC 4.8.2] on linux
1Type "help", "copyright", "credits" or "license" for more information.
1>>>

خطوط پشت سر هم در زمان وارد کردن ساختار چند خطی مورد نیاز است. به عنوان مثال این قطعه کد if را ببینید:

1>>>the_world_is_flat = True
1>>>if the_world_is_flat:
1...     print("Be careful not to fall off!")
1...
1Be careful not to fall off!

آموزش استفاده از مفسر پایتون قسمت دوم

آموزش استفاده از رمزنگاری متن کد در مفسر پایتون

به طور پیش فرض با متن فایل های پایتون به صورت رمزنگاری شده در UTF-8 رفتار می شود. در این رمزنگاری، کاراکتر های بیشتر زبان های جهان می تواند به طور همزمان در ادبیات(literals) رشته، شناسه ها(identifiers) و توضیحات (comments) مورد استفاده قرار گیرد.

اگرچه کتابخانه استاندارد تنها از کاراکترهای ASCII برای شناسه ها استفاده می کند، و این قراردادی است که هر کد قابل جا به جایی باید از آن پیروی کند. برای نمایش مناسب همه این کاراکتر ها، ویرایشگر شما باید تشخیص بدهد که فایل UTF-8 است، و از فونتی استفاده کند که از همه کاراکتر های استفاده شده در فایل پشتیبانی کند.

برای اعلان یک رمزنگار غیر از رمزنگار پیش فرض، یک خط توضیحات خاص باید در اولین خط فایل اضافه شود. نحو آن به صورت زیر است:

1# -*- coding: encoding -*-

در این جا encoding یکی از codecs های معتبر است که توسط پایتون پشتیبانی می شود. برای مثال، برای اعلان اینکه از رمزنگار Windows-1252 استفاده می شود، اولین خط از فایل متن کد شما باید این باشد:

1# -*- coding: cp1252 -*-

یک استثنا از قاعده خط اول زمانی است که متن کد با UNIX “shebang” line شروع شود. در این شرایط، اعلان رمز نگاری باید در خط دوم فایل اضافه شود. برای مثال:

1#!/usr/bin/env python3
1# -*- coding: cp1252 -*-

توجه !

در Unix، مفسر پایتون 3.x به صورت پیش فرض با نام قابل اجرای python نصب نشده است، بنابراین با پایتون 2.x قابل اجرا که به طور همزمان نصب شده باشد، در تعارض نیست.

معرفی غیر رسمی پایتون

در مثال های زیر، ورودی و خروجی با حضور یا عدم حضور prompt ها ( >>>و ... ) تشخیص داده می شود:

برای تکرار مثال، زمانی که prompt ظاهر شد، باید همه چیز را پس از prompt تایپ کنید. خطوطی که با prompt شروع نمی شود خروجی مفسر است. توجه داشته باشید که حضور یک prompt ثانویه در یک خط در مثال، به این معناست که باید یک خط خالی تایپ کنید. از این برای اتمام دستورات چند خطی استفاده می شود. بسیاری از مثال های این کتاب راهنما، حتی آنهایی که در prompt تعاملی وارد شده اند، شامل توضیحات می باشند.

در آموزش پایتون توضیحات با کاراکتر hash (#) شروع می شود و تا انتهای خط فیزیکی ادامه می یابد. توضیحات ممکن است در ابتدای یک خط، پس از فضای خالی و یا پس از کد شروع شود، اما نه در میان حروف یک رشته (string literal). یک کاراکتر hash در حروف یک رشته، تنها یک کاراکتر hash است. از آنجایی که توضیحات برای روشن تر و خوانا تر کردن کد است و توسط پایتون تفسیر نمی شود، ممکن است هنگام نوشتن مثال ها حذف شوند.

تعدادی مثال:

1# this is the first comment
1spam = 1  # and this is the second comment
1# ... and now a third!
1text = "# This is not a comment because it's inside quotes."

استفاده از پایتون به عنوان ماشین حساب

بیایید برخی دستورات ساده پایتون را امتحان کنیم. مفسر را شروع کنید و صبر کنید تا prompt اولیه ظاهر شود >>>. (نباید زمان زیادی طول بکشد.)

اعداد

مفسر به عنوان یک ماشین حساب ساده عمل می کند: می توانید یک عبارت را در آن تایپ کنید و مفسر مقدار آن را خواهد نوشت.

1نحوه نگارش عبارات سر راست است: عملگر های + ، - ، * و / همانند بسیاری از زبان های دیگر کار می کند (به عنوان مثال پاسکال یا C). از پرانتز ( () ) برای دسته بندی استفاده می شود. برای مثال:
1>>> 2 + 2
14
1>>> 50 - 5*6
120
1>>> (50 - 5*6) / 4
15.0
1>>>8 / 5  # division always returns a floating point number
11.6

اعداد صحیح (integer)

مثلا 2 ، 4 ، 20 از نوع int هستند و آنهایی که بخش کسری دارند مانند 5.0 ، 1.6 از نوع float هستند.

در ادامه این آموزش چیزهای بیشتری درباره انواع اعداد می بینیم. تقسیم (/ ) همیشه یک مقدار float باز می گرداند. برای انجام تقسیم کف (floor division) و گرفتن نتیجه صحیح ( چشم پوشی از هر نتیجه کسری) می توانید از عملگر (// ) استفاده کنید. برای محاسبه باقیمانده از % استفاده کنید.

1>>>17 / 3  # classic division returns a float
15.666666666666667
1>>>
1>>>17 // 3  # floor division discards the fractional part
15
1>>>17 % 3  # the % operator returns the remainder of the division
12
1>>>5 * 3 + 2  # result * divisor + remainder
117

در پایتون برای محاسبه توان میتوان از عملگر ** استفاده کرد

1>>>5 ** 2  # 5 squared
125
1>>>2 ** 7  # 2 to the power of 7
1128

از علامت مساوی (=) برای تخصیص یک مقدار به یک متغیر استفاده می شود. پس از آن هیچ نتیجه ای قبل از prompt تعاملی بعدی نمایش داده نمی شود.

1>>>width = 20
1>>>height = 5 * 9
1>>>width * height
1900

اگر یک متغیر تعریف نشده باشد (تخصیص یک مقدار)، در صورتی که بخواهید از آن استفاده کنید یک خطا دریافت خواهید کرد:

1>>> n  # try to access an undefined variable
1Traceback (most recent call last):
1File "", line 1, in 
1NameError: name 'n' is not defined
1

از اعداد اعشاری (floating point) به طور کامل پشتیبانی می شود. عملگر هایی با انواع متفاوت عملوند، عملوند از نوع صحیح را به اعشاری تبدیل می کنند.

1>>> 4 * 3.75 - 1
114.0

در حالت تعاملی، آخرین عبارت چاپ شده به متغیر _ تخصیص داده می شود. این به این معناست که هنگامی که از پایتون به عنوان ماشین حساب رو میزی استفاده می کنید، به نوعی ادامه محاسبات ساده تر می شود. برای مثال:

1>>>tax = 12.5 / 100
1>>>price = 100.50
1>>>price * tax
112.5625
1>>>price + _
1113.0625
1>>>round(_, 2)
1113.06

کاربر باید با این متغیر به صورت فقط خواندنی رفتار کند. به صراحت یک مقدار را به آن تخصیص ندهید. شما یک متغیر محلی مستقل با همان نام ایجاد می کنید که متغیر داخلی با رفتار جادویی را تحت پوشش خود می برد. علاوه بر int و float ، پایتون از سایر انواع اعداد نیز پشتیبانی می کند، از جمله Decimalو Fraction . همچنین پایتون پشتیبانی داخلی برای اعداد مختلط نیز دارد و از پسوند j یا J برای نمایش بخش موهومی عدد استفاده می کند، برای مثال 3+5j.

رشته ها در برنامه نویسی python

پایتون علاوه بر اعداد، میتواند رشته ها را نیز مدیریت کند. رشته ها به چندین طریق می توانند بیان شوند. رشته ها می توانند در نقل قول تکی ('...') و یا دوتایی ("...") قرار گیرند، و در هر دو صورت نتیجه یکسان است.2 از برای در رفتن از نقل قول استفاده می شود.

1>>>'spam eggs'  # single quotes
1'spam eggs'
1>>>'doesn't'  # use ' to escape the single quote...
1"doesn't"
1>>>"doesn't"  # ...or use double quotes instead
1"doesn't"
1>>>'"Yes," they said.'
1'"Yes," they said.'
1>>>""Yes," they said."
1'"Yes," they said.'
1>>>'"Isn't," they said.'
1'"Isn't," they said.'

در مفسر تعاملی، رشته خروجی درون نقل قول قرار می گیرد و از کاراکتر های خاص با backslash ها صرف نظر میشود. در حالی که ممکن است گاهی این متفاوت از ورودی به نظر برسد (نقل قول های در بر گیرنده می توانند تغییر کنند)، هر دو رشته برابر هستند. اگر رشته شامل نقل قول تکی باشد و هیچ نقل قول دوتایی نداشته باشد، رشته در نقل قول دوتایی قرار می گیرد. در غیر این صورت، در نقل قول تکی قرار میگیرد. تابع print() با حذف نقل قول های در برگیرنده و چاپ کاراکتر های خاص و escaped ، خروجی خوانا تری تولید می کند.

1>>>'"Isn't," they said.'
1'"Isn't," they said.'
1>>>print('"Isn't," they said.')
1"Isn't," they said.
1>>>s = 'First line.nSecond line.'  # n means newline
1>>>s  # without print(), n is included in the output
1'First line.nSecond line.'
1>>>print(s)  # with print(), n produces a new line
1First line.
1Second line.

اگر نمی خواهید کاراکترهایی که بعد از قرار دارند به عنوان کاراکتر های خاص تفسیر شوند، می توانید با اضافه کردن یک r قبل از اولین نقل قول از رشته خام (raw strings) استفاده کنید.

1>>>print('C:somename')  # here n means newline!
1C:some
1ame
1>>>print(r'C:somename')  # note the r before the quote
1C:somename

حروف رشته می توانند در چندین خط قرار گیرند. یک روش استفاده از نقل قول سه تایی است : """...""" یا '''...''' . انتهای خطوط به صورت خودکار در رشته قرار دارد، اما با اضافه کردن در انتهای خط می توان از آن جلوگیری کرد. مثال زیر:

1print("""
1Usage: thingy [OPTIONS]
1-h                        Display this usage message
1-H hostname               Hostname to connect to
1""")

خروجی زیر را تولید می کند( توجه داشته باشید که شامل خط جدید اولیه نیست).

1Usage: thingy [OPTIONS]
1-h                        Display this usage message
1-H hostname               Hostname to connect to

رشته ها می توانند با استفاده از عملگر + به همدیگر متصل شوند (مانند چسب به هم بچسبند) و با عملگر * تکرار شوند:

1>>># 3 times 'un', followed by 'ium'
1>>>3 * 'un' + 'ium'
1'unununium'

تعداد دو یا بیشتر از حروف رشته در کنار یکدیگر(مثل آنهایی که درون یک نقل قول قرار دارند) به صورت خودکار به هم چسبیده هستند.

1>>>'Py' 'thon'
1'Python'

این ویژگی به خصوص در زمانی که قصد شکستن رشته های طولانی را دارید مفید است.

1>>>text = ('Put several strings within parentheses '
1...         'to have them joined together.')
1>>>text
1'Put several strings within parentheses to have them joined together.'

البته این ویژگی فقط با دو حرف کار میکند نه با متغیرها یا عبارات.

1>>> prefix = 'Py'
1>>> prefix 'thon'  # can't concatenate a variable and a string literal
1File "", line 1
1prefix 'thon'
1^
1SyntaxError: invalid syntax
1>>> ('un' * 3) 'ium'
1File "", line 1
1('un' * 3) 'ium'
1^
1SyntaxError: invalid syntax
1

اگر می خواهید متغیر ها را اتصال دهید یا یک متغیر و یک حرف، از + استفاده کنید.

1>>>prefix + 'thon'
1'Python

رشته ها می توانند اندیس گذاری شوند (زیر نویس دار) به این صورت که اندیس اولین کاراکتر صفر باشد. هیچ نوع کاراکتر مجزا وجود ندارد. یک کاراکتر در واقع یک رشته به طول یک است.

1>>>word = 'Python'
1>>>word[0]  # character in position 0
1'P'
1>>>word[5]  # character in position 5
1'n'

همچنین، اندیس ها ممکن است به منظور شمارش از راست، منفی باشند.

1>>>word[-1]  # last character
1'n'
1>>>word[-2]  # second-last character
1'o'
1>>>word[-6]
1'P'

توجه داشته باشید از آنجایی که -0 همان 0 است، اندیس های منفی از -1 شروع می شوند. علاوه بر اندیس گذاری، از برش زدن (slicing) نیز پشتیبانی می شود. در حالی که از اندیس گذاری برای دسترسی به کاراکترها به صورت مجزا استفاده می شود، برش زدن به شما امکان دسترسی به زیر رشته ها را می دهد.

1>>>word[0:2]  # characters from position 0 (included) to 2 (excluded)
1'Py'
1>>>word[2:5]  # characters from position 2 (included) to 5 (excluded)
1'tho'

توجه داشته باشید که چگونه همیشه شروع بازه شامل می شود و انتهای بازه حذف. این نشان می دهد s[:i] + s[i:] همیشه با s برابر است.

1>>>word[:2] + word[2:]
1'Python'
1>>>word[:4] + word[4:]
1'Python'

برش اندیس ها، پیش فرض های مفیدی دارد. اندیس اول حذف شده به طور پیش فرض صفر است . اندیس دوم حذف شده به طور پیش فرض سایز رشته برش خورده است.

1>>>word[:2]   # character from the beginning to position 2 (excluded)
1'Py'
1>>>word[4:]   # characters from position 4 (included) to the end
1'on'
1>>>word[-2:]  # characters from the second-last (included) to the end
1'on'

یک روش برای به یاد داشتن نحوه عملکرد برش این است که به اندیس ها به عنوان اشاره گر بین کاراکترها نگاه کنید، به این صورت که سمت چپ اولین کاراکتر شماره صفر باشد. سپس سمت راست آخرین کاراکتر یک رشته با تعداد n کاراکتر، اندیس n دارد. برای مثال:

 

12+---+---+---+---+---+---+
 | P | y | t | h | o | n |
1+---+---+---+---+---+---+
10   1   2   3   4   5   6
1-6  -5  -4  -3  -2  -1

 

ردیف اول شماره ها مکان اندیس های 0 … 6 در رشته را بیان می کند. ردیف دوم اندیس های منفی متناظر را می دهد. یک برش از i به j ، شامل همه کاراکتر ها بین لبه با نام i و لبه با نام j است. برای اندیس های غیر منفی، طول یک برش اختلاف اندیس ها است، اگر هر دو در بازه باشند. برای مثال، طول word[1:3 2 است. استفاده از اندیس خیلی بزرگ باعث بروز خطا می شود.

1>>> word[42]  # the word only has 6 characters
1Traceback (most recent call last):
1File "", line 1, in 
1IndexError: string index out of range
1

اگر چه اندیس های برش خارج از بازه در هنگام استفاده از برش، با ظرافت مدیریت می شود.

1>>>word[4:42]
1'on'
1>>>word[42:]
1''

رشته ها در پایتون نمیتوانند تغییر کنند. آنها تغییر ناپذیر (immutable) هستند. بنابراین، تخصیص به یک مکان اندیس گذاری شده در رشته باعث بروز خطا می شود.

1>>> word[0] = 'J'
1Traceback (most recent call last):
1File "", line 1, in 
1TypeError: 'str' object does not support item assignment
1>>> word[2:] = 'py'
1Traceback (most recent call last):
1File "", line 1, in 
1TypeError: 'str' object does not support item assignment
1

اگر به یک رشته متفاوت احتیاج دارید، باید یک رشته جدید ایجاد کنید.

1>>>'J' + word[1:]
1'Jython'
1>>>word[:2] + 'py'
1'Pypy'

تابع داخلی len() طول رشته را باز می گرداند.

1>>>s = 'supercalifragilisticexpialidocious'
1>>>len(s)
134

لیست ها در برنامه نویسی python

زبان برنامه نویسی پایتون تعدادی انواع داده ترکیبی برای دسته بندی مقادیر مختلف با هم، می شناسد. متنوع ترین آن لیست است، که می توان آن را به صورت لیستی از مقادیر که درون ([]) با ویرگول (,) از هم جدا شده اند نوشت. لیست ممکن است شامل مواردی از انواع مختلف باشد، اما معمولا همه موارد از نوع یکسانی برخوردار هستند.

1>>>squares = [1, 4, 9, 16, 25]
1>>>squares
1[1, 4, 9, 16, 25]

همانند رشته ها (و سایر انواع داخلی ترتیبی)، لیست نیز می تواند اندیس گذاری و برش شود.

1>>>squares[0]  # indexing returns the item
11
1>>>squares[-1]
125
1>>>squares[-3:]  # slicing returns a new list
1[9, 16, 25]

همه عملیات برش یک لیست جدید شامل عناصر درخواست شده را باز می گرداند. این به این معناست که برش مورد نظر یک کپی سطحی از لیست را باز می گرداند.

1>>>squares[:]
1[1, 4, 9, 16, 25]

همچنین لیست ها از عملیاتی نظیر اتصال پشتیبانی می کنند.

1>>>squares + [36, 49, 64, 81, 100]
1[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

برخلاف رشته ها که غیر قابل تغییر هستند، لیست یک نوع قابل تغییر است و می توان محتویات آن را تغییر داد.

1>>>cubes = [1, 8, 27, 65, 125]  # something's wrong here
1>>>4 ** 3  # the cube of 4 is 64, not 65!
164
1>>>cubes[3] = 64  # replace the wrong value
1>>>cubes
1[1, 8, 27, 64, 125]

همچنین می توانید با استفاده از متد append() (درباره متد ها در آینده بیشتر صحبت خواهیم کرد) مواردی را به انتهای لیست اضافه کنید.

1>>>cubes.append(216)  # add the cube of 6
1>>>cubes.append(7 ** 3)  # and the cube of 7
1>>>cubes
1[1, 8, 27, 64, 125, 216, 343]
1تخصیص به برش ها نیز امکان پذیر است. این امر حتی می تواند سایز لیست را تغییر دهد یا کلا آن را خالی کند.
1>>>letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
1>>>letters
1['a', 'b', 'c', 'd', 'e', 'f', 'g']
1>>># replace some values
1>>>letters[2:5] = ['C', 'D', 'E']
1>>>letters
1['a', 'b', 'C', 'D', 'E', 'f', 'g']
1>>># now remove them
1>>>letters[2:5] = []
1>>>letters
1['a', 'b', 'f', 'g']
1>>># clear the list by replacing all the elements with an empty list
1>>>letters[:] = []
1>>>letters
1[]

همچنین تابع داخلی len() نیز بر روی لیست ها اعمال می شود.

1>>>letters = ['a', 'b', 'c', 'd']
1>>>len(letters)
14

می توان لیست ها را تو در تو کرد (ایجاد لیستی شامل لیست های دیگر). برای مثال:

1>>>a = ['a', 'b', 'c']
1>>>n = [1, 2, 3]
1>>>x = [a, n]
1>>>x
1[['a', 'b', 'c'], [1, 2, 3]]
1>>>x[0]
1['a', 'b', 'c']
1>>>x[0][1]
1'b'

آموزش پایتون ادامه دارد